-1

backgroundMATLAB 代码通过创建一个元胞数组backgroundSample{1}, backgroundSample{2}, ... ,对灰度图像的一部分进行采样backgroundSample{9}。这里halfRowshalfCols是图像的一半大小。

因为backgroundSample是一个包含九个二维矩阵的数组。我很困惑如何用 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;

编辑:
因为我们可以A = B在 MATLAB 中简单地分配一个矩阵。例如,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]。如何解决问题?

4

1 回答 1

0

实现您所描述的最简单的方法是声明一个多维数组:

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]。请注意通过取消引用指针->来访问字段的数组运算符。elementsbackgroundSample[k]

注意:每次调用都new需要在完成时伴随一个匹配的调用delete以释放内存,

delete[] backgroundSample;

希望有帮助!

于 2013-08-21T11:58:28.697 回答