int VariantToDoubleArray(double **data, VARIANT *var) { long uBnd,lBnd; int dim, dimlen[MAXDIM]; int err=0; // Check for ARRAY of the right type logToFile((f, "VaraintToDoubleArray: var = 0x%p\n", var)); if( var==NULL ) return COMUTIL_ERR_NULL; logToFile((f, "VaraintToDoubleArray: var.type = %d\n", var->vt)); if (var->vt == VT_ERROR){ *data = NULL; return 0; } if( !( (var->vt) & VT_ARRAY ) ) err += COMUTIL_ERR_ARRAY; if( !( (var->vt) & VT_R8 ) ) err += COMUTIL_ERR_TYPE; if(err) return err; // Get Overall Length (number of elements, ignore shape of Safearray) dim = SafeArrayGetDim(var->parray); for(int d=1; d<=dim; d++){ SafeArrayGetLBound(var->parray, d, &lBnd); SafeArrayGetUBound(var->parray, d, &uBnd); dimlen[d-1] = uBnd-lBnd+1; } logToFile((f, "VaraintToDoubleArray: %d, (%d, %d)\n", dim, dimlen[0], dimlen[1])); *data = CreateDoubleArray(dim, dimlen); if (*data != NULL) { // Get reference pointer for accessing the SafeArray void *sap; if( FAILED( SafeArrayAccessData(var->parray, (void**)&sap) )) return COMUTIL_ERR_SAFEARRAY; memcpy(*data, sap, sizeof(double) * GetLength(*data)); // Release reference pointer SafeArrayUnaccessData (var->parray); } // Return Success return 0; }
void CMatlabDlg3::Update() { if (!m_IsShowing) { return; } if (m_PlaneTrueInput == NULL) { m_PlaneTrueInput = CreateDoubleArray(m_PlaneTrueDatas.size(), m_Size * MATLAB_DRAW_TRUE_DATA_SIZE, (const unsigned char *)NULL, 0, 0); // } // { double *data = mxGetPr(m_PlaneTrueInput); for (int plane = 0; plane < m_PlaneTrueDatas.size(); ++plane) { for (int pos = 0; pos < m_PlaneTrueDatas[plane].size(); ++pos) { data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 0) * m_PlaneTrueDatas.size() + plane] = m_PlaneTrueDatas[plane][pos].X; data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 1) * m_PlaneTrueDatas.size() + plane] = m_PlaneTrueDatas[plane][pos].Y; data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 2) * m_PlaneTrueDatas.size() + plane] = m_PlaneTrueDatas[plane][pos].Z; } } } if (m_TargetTrueInput == NULL) { m_TargetTrueInput = CreateDoubleArray(m_TargetTrueDatas.size(), m_Size * MATLAB_DRAW_TRUE_DATA_SIZE, (const unsigned char *)NULL, 0, 0); // } // { double *data = mxGetPr(m_TargetTrueInput); for (int target = 0; target < m_TargetTrueDatas.size(); ++target) { for (int pos = 0; pos < m_TargetTrueDatas[target].size(); ++pos) { data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 0) * m_TargetTrueDatas.size() + target] = m_TargetTrueDatas[target][pos].X; data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 1) * m_TargetTrueDatas.size() + target] = m_TargetTrueDatas[target][pos].Y; data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 2) * m_TargetTrueDatas.size() + target] = m_TargetTrueDatas[target][pos].Z; } } } if (m_TargetFusionInput == NULL) { m_TargetFusionInput = CreateDoubleArray(m_TargetFusionDatas.size(), m_Size * MATLAB_DRAW_FUSION_DATA_SIZE, (const unsigned char *)NULL, 0, 0); // } // { double *data = mxGetPr(m_TargetFusionInput); for (int target = 0; target < m_TargetFusionDatas.size(); ++target) { for (int pos = 0; pos < m_TargetFusionDatas[target].size(); ++pos) { data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 0) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Pos.X; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 1) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Pos.Y; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 2) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Pos.Z; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 3) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Vel.X; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 4) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Vel.Y; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 5) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Vel.Z; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 6) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Acc.X; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 7) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Acc.Y; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 8) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Acc.Z; } } } if (m_TargetFilterInput == NULL) { m_TargetFilterInput = CreateDoubleArray(m_TargetFilterDatas.size(), m_Size * MATLAB_DRAW_FUSION_DATA_SIZE, (const unsigned char *)NULL, 0, 0); // } // { double *data = mxGetPr(m_TargetFilterInput); for (int target = 0; target < m_TargetFilterDatas.size(); ++target) { for (int pos = 0; pos < m_TargetFilterDatas[target].size(); ++pos) { data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 0) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Pos.X; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 1) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Pos.Y; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 2) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Pos.Z; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 3) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Vel.X; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 4) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Vel.Y; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 5) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Vel.Z; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 6) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Acc.X; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 7) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Acc.Y; data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 8) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Acc.Z; } } } if (m_GlobalVarInput == NULL) { m_GlobalVarInput = CreateDoubleArray(PLANE_COUNT + TARGET_COUNT_MAX, GLOBAL_VAR_FRAME_SIZE, (const unsigned char *)NULL, 0, 0); // } // { double *data = mxGetPr(m_GlobalVarInput); for (int i = 0; i < PLANE_COUNT + TARGET_COUNT_MAX; ++i) { for (int j = 0; j < GLOBAL_VAR_FRAME_SIZE; ++j) { data[j * (PLANE_COUNT + TARGET_COUNT_MAX) + i] = g_GlobalVar[i].m_G[j]; } } } vector<Array *> inputList; inputList.push_back(m_PlaneTrueInput); inputList.push_back(m_TargetTrueInput); inputList.push_back(m_TargetFusionInput); inputList.push_back(m_TargetFilterInput); inputList.push_back(m_GlobalVarInput); vector<Array *> outputList(1); bool result = m_MatlabFunc(0, &outputList[0], inputList.size(), &inputList[0]); if (!result) { CString msg; msg.AppendFormat(TEXT("函数%s调用失败."), m_FuncName); AfxMessageBox(msg); } }