#include "math.h"
#include "mex.h"
#include "assert.h"
#include <stdio.h>
#include <string.h>
#include "sisc_lib.h"
int patch_M;
int patch_N;
int num_channels;
int num_bases;
const double* lambda;
double* A_freq_real;
double* A_freq_imag;
const mxArray* CtC_all;
const double* CtC_allr;
const double* CtC_alli;
const mxArray* Ctd_all;
const double* Ctd_allr;
const double* Ctd_alli;
void basis_solve(void)
{
int row,col,chan,basis,patch,elt,i,j;
mxArray* CtC, *Ctd;
CtC = mxCreateDoubleMatrix(num_bases,num_bases,mxCOMPLEX);
Ctd = mxCreateDoubleMatrix(num_bases,1,mxCOMPLEX);
double zeros[num_bases*num_bases];
for (elt=0; elt<num_bases*num_bases; elt++){
zeros[elt]=0;
}
int basis_elts = num_bases*(num_bases+1)/2;
int row_elts = patch_M/2+1;
double* CtCr, *CtCi;
CtCr = mxGetPr(CtC);
CtCi = mxGetPi(CtC);
for (col=0; col<patch_N; col++){
for (row=0; row<=patch_M/2; row++){
mxArray* arguments[2];
int symm = (row > 0 && row < patch_M/2);
/* Copy C'*C */
for (j=0; j<num_bases; j++){
for (i=0; i<=j; i++){
CtCr[i*num_bases+j] = CtC_allr[row*basis_elts + col*row_elts*basis_elts + tri(i,j)];
CtCr[j*num_bases+i] = CtC_allr[row*basis_elts + col*row_elts*basis_elts + tri(i,j)];
}
}
if (mxIsComplex(CtC_all)){
for (j=0; j<num_bases; j++){
for (i=0; i<=j; i++){
CtCi[i*num_bases+j] = -CtC_alli[row*basis_elts + col*row_elts*basis_elts + tri(i,j)];
CtCi[j*num_bases+i] = CtC_alli[row*basis_elts + col*row_elts*basis_elts + tri(i,j)];
}
}
} else {
memcpy(CtCi, zeros, basis_elts*sizeof(double));
}
CtCr = mxGetPr(CtC);
for (basis=0; basis<num_bases; basis++){
CtCr[basis*num_bases+basis] += lambda[basis];
}
for (chan=0; chan<num_channels; chan++){
mxArray* ans;
double *ans_real, *ans_imag;
/* d = reshape(X_freq_all(row,col,chan,:),num_patches,1); */
/* Copy C'*d */
memcpy(mxGetPr(Ctd), &Ctd_allr[chan*num_bases + row*num_bases*num_channels + col*row_elts*num_bases*num_channels],
num_bases*sizeof(double));
if (mxIsComplex(Ctd_all)){
memcpy(mxGetPi(Ctd), &Ctd_alli[chan*num_bases + row*num_bases*num_channels + col*row_elts*num_bases*num_channels],
num_bases*sizeof(double));
} else {
memcpy(mxGetPi(Ctd), zeros, num_bases*sizeof(double));
}
/* A_freq(row,col,chan,:) = (C'*C+Lambda)\(C'*d); */
arguments[0] = CtC;
arguments[1] = Ctd;
mexCallMATLAB(1,&ans,2,arguments,"mldivide");
ans_real = mxGetPr(ans);
if (mxIsComplex(ans)){
ans_imag = mxGetPi(ans);
} else {
ans_imag = zeros;
}
for (basis=0; basis<num_bases; basis++){
int ind = basis*patch_M*patch_N*num_channels
+chan*patch_M*patch_N
+col*patch_M
+row;
A_freq_real[ind] = ans_real[basis];
A_freq_imag[ind] = ans_imag[basis];
if (symm){
int symm_col = (col == 0) ? 0 : patch_N-col;
int symm_row = patch_M-row;
ind = basis*patch_M*patch_N*num_channels
+chan*patch_M*patch_N
+symm_col*patch_M
+symm_row;
A_freq_real[ind] = ans_real[basis];
A_freq_imag[ind] = -ans_imag[basis];
}
}
mxDestroyArray(ans);
}
}
}
mxDestroyArray(CtC);
mxDestroyArray(Ctd);
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
const mwSize* dims;
mwSize dims_[4];
mxAssert(nlhs==1,"Expects one output argument.\n");
mxAssert(nrhs==3,"Expects three input arguments.\n");
mxAssert(mxIsDouble(prhs[0]), "CtC must be a double array.\n");
char* CtC_err = "CtC must be num_bases*(num_bases+1)/2 x (patch_M/2 + 1) x patch_N.\n";
CtC_all = prhs[0];
dims = mxGetDimensions(CtC_all);
num_bases = inv_tri(dims[0]);
patch_M = 2*(dims[1]-1);
if (mxGetNumberOfDimensions(CtC_all)==3){
patch_N = dims[2];
} else {
patch_N = 1;
}
CtC_allr = mxGetPr(CtC_all);
if (mxIsComplex(CtC_all)){
CtC_alli = mxGetPi(CtC_all);
}
mxAssert(mxIsDouble(prhs[1]), "Ctd must be a double array.\n");
char* Ctd_err = "Ctd must be num_bases x num_channels x (patch_M/2 + 1) x patch_N.\n";
Ctd_all = prhs[1];
dims = mxGetDimensions(Ctd_all);
mxAssert(dims[0] == num_bases, Ctd_err);
num_channels = dims[1];
mxAssert(dims[2] == patch_M/2+1, Ctd_err);
if (mxGetNumberOfDimensions(Ctd_all)==4){
mxAssert(dims[3] == patch_N, Ctd_err);
} else {
mxAssert(1 == patch_N, Ctd_err);
}
Ctd_allr = mxGetPr(Ctd_all);
if (mxIsComplex(Ctd_all)){
Ctd_alli = mxGetPi(Ctd_all);
}
mexPrintf("patch_M %d num_bases %d\n", patch_M, num_bases);
mxAssert(mxIsDouble(prhs[2]), "lambda must be a double array.\n");
mxAssert(mxGetM(prhs[2])==num_bases && mxGetN(prhs[2])==1,"lambda must be num_bases x 1.\n");
lambda = mxGetPr(prhs[2]);
dims_[0] = patch_M;
dims_[1] = patch_N;
dims_[2] = num_channels;
dims_[3] = num_bases;
plhs[0] = mxCreateNumericArray(4,dims_,mxDOUBLE_CLASS,mxCOMPLEX);
A_freq_real = mxGetPr(plhs[0]);
A_freq_imag = mxGetPi(plhs[0]);
basis_solve();
}
程式報錯了好多:
basis_solve_mex.c(9) : error C2059: 語法錯誤 : “/”
basis_solve_mex.c(36) : error C2143: 語法錯誤 : 缺少“;”(在“型別”的前面)
basis_solve_mex.c(38) : error C2065: “zeros”: 未宣告的識別符號
basis_solve_mex.c(38) : error C2109: 下標要求陣列或指標型別
basis_solve_mex.c(41) : error C2143: 語法錯誤 : 缺少“;”(在“型別”的前面)
basis_solve_mex.c(42) : error C2143: 語法錯誤 : 缺少“;”(在“型別”的前面)
basis_solve_mex.c(44) : error C2143: 語法錯誤 : 缺少“;”(在“型別”的前面)
basis_solve_mex.c(45) : error C2065: “CtCr”: 未宣告的識別符號
basis_solve_mex.c(45) : warning C4047: “=”: “int”與“double *”的間接級別不同
basis_solve_mex.c(46) : error C2065: “CtCi”: 未宣告的識別符號
basis_solve_mex.c(46) : warning C4047: “=”: “int”與“double *”的間接級別不同
basis_solve_mex.c(49) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(51) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(56) : error C2065: “CtCr”: 未宣告的識別符號
basis_solve_mex.c(56) : error C2109: 下標要求陣列或指標型別
basis_solve_mex.c(56) : error C2065: “basis_elts”: 未宣告的識別符號
basis_solve_mex.c(56) : error C2065: “row_elts”: 未宣告的識別符號
basis_solve_mex.c(56) : error C2065: “basis_elts”: 未宣告的識別符號
basis_solve_mex.c(57) : error C2065: “CtCr”: 未宣告的識別符號
basis_solve_mex.c(57) : error C2109: 下標要求陣列或指標型別
basis_solve_mex.c(57) : error C2065: “basis_elts”: 未宣告的識別符號
basis_solve_mex.c(57) : error C2065: “row_elts”: 未宣告的識別符號
basis_solve_mex.c(57) : error C2065: “basis_elts”: 未宣告的識別符號
basis_solve_mex.c(63) : error C2065: “CtCi”: 未宣告的識別符號
basis_solve_mex.c(63) : error C2109: 下標要求陣列或指標型別
basis_solve_mex.c(63) : error C2065: “basis_elts”: 未宣告的識別符號
basis_solve_mex.c(63) : error C2065: “row_elts”: 未宣告的識別符號
basis_solve_mex.c(63) : error C2065: “basis_elts”: 未宣告的識別符號
basis_solve_mex.c(64) : error C2065: “CtCi”: 未宣告的識別符號
basis_solve_mex.c(64) : error C2109: 下標要求陣列或指標型別
basis_solve_mex.c(64) : error C2065: “basis_elts”: 未宣告的識別符號
basis_solve_mex.c(64) : error C2065: “row_elts”: 未宣告的識別符號
basis_solve_mex.c(64) : error C2065: “basis_elts”: 未宣告的識別符號
basis_solve_mex.c(68) : error C2065: “CtCi”: 未宣告的識別符號
basis_solve_mex.c(68) : warning C4022: “memcpy”: 指標與實參 1 不匹配
basis_solve_mex.c(68) : error C2065: “zeros”: 未宣告的識別符號
basis_solve_mex.c(68) : warning C4022: “memcpy”: 指標與實參 2 不匹配
basis_solve_mex.c(68) : error C2065: “basis_elts”: 未宣告的識別符號
basis_solve_mex.c(71) : error C2065: “CtCr”: 未宣告的識別符號
basis_solve_mex.c(71) : warning C4047: “=”: “int”與“double *”的間接級別不同
basis_solve_mex.c(73) : error C2065: “CtCr”: 未宣告的識別符號
basis_solve_mex.c(73) : error C2109: 下標要求陣列或指標型別
basis_solve_mex.c(82) : error C2065: “row_elts”: 未宣告的識別符號
basis_solve_mex.c(85) : error C2065: “row_elts”: 未宣告的識別符號
basis_solve_mex.c(88) : error C2065: “zeros”: 未宣告的識別符號
basis_solve_mex.c(88) : warning C4022: “memcpy”: 指標與實參 2 不匹配
basis_solve_mex.c(99) : error C2065: “zeros”: 未宣告的識別符號
basis_solve_mex.c(99) : warning C4047: “=”: “double *”與“int”的間接級別不同
basis_solve_mex.c(103) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(104) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(106) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(113) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(114) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(115) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(117) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(145) : error C2143: 語法錯誤 : 缺少“;”(在“型別”的前面)
basis_solve_mex.c(148) : warning C4267: “函式”: 從“size_t”轉換到“int”,可能丟失資料
basis_solve_mex.c(149) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(149) : warning C4267: “=”: 從“size_t”轉換到“int”,可能丟失資料
basis_solve_mex.c(151) : warning C4267: “=”: 從“size_t”轉換到“int”,可能丟失資料
basis_solve_mex.c(161) : error C2143: 語法錯誤 : 缺少“;”(在“型別”的前面)
basis_solve_mex.c(164) : error C2065: “Ctd_err”: 未宣告的識別符號
basis_solve_mex.c(164) : warning C4047: “函式”: “const char *”與“int”的間接級別不同
basis_solve_mex.c(164) : warning C4024: “mexPrintAssertion”: 形參和實參 4 的型別不同
basis_solve_mex.c(165) : warning C4267: “=”: 從“size_t”轉換到“int”,可能丟失資料
basis_solve_mex.c(166) : error C2065: “patch_M”: 未宣告的識別符號
basis_solve_mex.c(166) : error C2065: “Ctd_err”: 未宣告的識別符號
basis_solve_mex.c(166) : warning C4047: “函式”: “const char *”與“int”的間接級別不同
basis_solve_mex.c(166) : warning C4024: “mexPrintAssertion”: 形參和實參 4 的型別不同
basis_solve_mex.c(168) : error C2065: “Ctd_err”: 未宣告的識別符號
basis_solve_mex.c(168) : warning C4047: “函式”: “const char *”與“int”的間接級別不同
basis_solve_mex.c(168) : warning C4024: “mexPrintAssertion”: 形參和實參 4 的型別不同
basis_solve_mex.c(170) : error C2065: “Ctd_err”: 未宣告的識別符號
basis_solve_mex.c(170) : warning C4047: “函式”: “const char *”與“int”的間接級別不同
basis_solve_mex.c(170) : warning C4024: “mexPrintAssertion”: 形參和實參 4 的型別不同
basis_solve_mex.c(177,183) : error C2065: “patch_M”: 未宣告的識別符號
uj5u.com熱心網友回復:
#include <windows.h> ??uj5u.com熱心網友回復:
并不是,還是一大堆錯誤呢uj5u.com熱心網友回復:
代碼是從哪復制的??仔細檢查一下各種頭檔案,還有/ ; 是否都是半角uj5u.com熱心網友回復:
檢查mex.h是否有問題還是需要什么頭檔案,是不是缺了??例如mxArray在哪里定義的??轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/130506.html
標籤:基礎類
上一篇:win2012server 上用ado連接 oracle12c 出現800a0e7a source adodb.connection 未找到提供程式
