1
我正在嘗試編寫一個C++ mex函數來遍歷矩陣的單元數組,每個矩陣的大小不同。在Matlab中,我可以做到這一點使用以下代碼:在mex函數中索引和訪問單元格數組和矩陣的元素
function Z = myFunction(X, Z, B)
for i = 1:size(X, 1)
for j = 1:size(X, 2)
for k = 1:size(X, 3)
temp = X{i, j, k};
for m = 1:size(temp, 1)
Z{temp(m, 1)}(temp(m, 2)) = Z{temp(m, 1)}(temp(m, 2)) + B(i, j, k);
end
end
end
end
這裏X是一個3維單元陣列,其中每個單元包含行的可變數目和2列的矩陣。這兩列允許我索引另一個向量Z的單元陣列,其中每個向量具有不同的長度。
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
const mxArray* X = prhs[0];
const mxArray* Z = prhs[1];
const mxArray* B = prhs[2];
const int* pDims = mxGetDimensions(X);
mwSize nsubs = mxGetNumberOfDimensions(X);
for (size_t i = 0; i < pDims[0]; i++) {
for (size_t j = 0; j < pDims[1]; j++) {
for (size_t k = 0; k < pDims[2]; k++) {
int subs [] = {i, j, k};
mxArray* temp = mxGetCell(X, mxCalcSingleSubscript(X, nsubs, subs));
const int* matDims = mxGetDimensions(temp);
for (size_t m = 0; m < matDims[0]; m++) {
}
}
}
}
}
:Z中的載體的元素被索引通過從3維矩陣B.
到目前爲止,I(前我從未編碼在C++)在C以下代碼++元素遞增
問題:
- 要訪問矩陣B的元素,我可以使用我一樣訪問單元陣列X的元素相同的功能mxCalcSingleSubscript?如果不是,我該怎麼做?
- 如何訪問
temp
的元素並執行索引,正如我在Matlab代碼中所做的那樣?
太謝謝你了對於有用的評論!完美的作品。我只是想知道,如果我刪除'X','Z'和'B'的聲明前面的'const',並用第27行和第33行中的'Z'替換'out',爲什麼'Z'沒有被修改?現在'Z_out'沒有指向'Z'的元素而不是'out'的元素,因此第28行直接修改了'Z'?這會比複製數組快嗎? –
此外,避免使用'mxCalcSingleSubscript' /'sub2ind'並使用'i','j','k'和'm'直接對'X'和'temp'進行索引會更快嗎? –
所有到mex函數(包括X,Z和B)的輸入都是常量,必須/不能修改。所以你應該創建一個副本並進行更改。 'Z_out'指向'out'的元素 – rahnema1