MATLAB代码通过创建为backgroundbackgroundSample{1},...,backgroundSample{2}的单元格数组对灰度图像的backgroundSample{9}部分进行采样。此处halfRowshalfCols是图像的一半大小。

由于backgroundSample是包含九个2-D矩阵的数组。我很困惑如何用C / C ++编写此代码。我可以使用类似backgroundSample{i}的方法获取backgroundSample[i].elements[m][n]的元素吗?

MATLAB代码:

offset = [-60, -20, 20, 60];
for i = 1: 1: 3
    for j = 1: 1: 3
        backgroundSample{(i - 1) * 3 + j} =
        background(halfRows + offset(i): halfRows + offset(i + 1), ...
                   halfCols + offset(j): halfCols + offset(j + 1));
    end;
end;


编辑:
因为我们可以通过MATLAB中的A = B轻松分配矩阵。例如,我的问题中的backgroundSample{1} = background(60: 100, 60: 100)且此分配位于i:1→3和j:1→3的循环中。但是,在C / C ++中分配矩阵时,它应该一个一个地分配每个元素。可能是这样的:

for(int i = 0; i < 3; i++)
    for(int j = 0; n < 3; j++)
        // to get every elements
        for(int m = 0 ...)
            for(int n = 0 ...)
                // not sure whether there is such usage of "->" in array
                backgroundSample[(i - 1) * 3 + j]->elements[m][n] =  background[i iteration][j iteration]


因此,矩阵backgroundSample[m][n]background[i][j]的索引之间存在冲突。该如何解决?

最佳答案

实现所描述内容的最简单方法是声明多维数组:

int backgroundSample[9][3][3];


假设每个二维矩阵的尺寸为3×3。要访问第k个矩阵中的(m,n)元素,请编写backgroundSample[k][m][n],例如:

for (int m = 0; m < 3; ++m)
{
    for(int n = 0; n < 3; ++n)
    {
       backgroundSample[(i - 1) * 3 + j][m][n] = background[i][j];
    }
}


或者,如果此数组中的每个样本存储更多信息,则可以声明一个结构:

typedef struct
{
    int elements[3][3];

    // More fields...
} TSample;


然后创建以下数组:

TSample backgroundSample[9];


要访问元素,您可以编写backgroundSample[k].elements[m][n]

还可以动态分配内存(在运行时,这意味着您不知道预先拥有多少这些结构):

TSample* backgroundSample;


在C ++中,内存分配的实际过程如下所示:

backgroundSample = new TSample[9];


通过编写backgroundSample[k]->elements[m][n]可以访问元素。注意,通过取消引用指针->来访问字段elements的数组运算符backgroundSample[k]

注意:每次对new的调用都需要伴随对delete的匹配调用以释放内存,即:

delete[] backgroundSample;


希望有帮助!

关于c++ - 用C/C++编写MATLAB数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18354062/

10-11 22:08