【问题标题】:Operations in cells单元格中的操作
【发布时间】:2016-02-27 17:42:31
【问题描述】:

我有一个 5x5 的单元格,每个单元格都有 100x100 个单个数据。我想计算每个矩阵 100x100 中的模式,然后做一些取决于模式的操作。我怎样才能做到这一点?

单元格:

每个单元格都有 100x100 的数据,如下所示:

我有这段代码可以计算每个单元格的模式,现在我想将 100x100 矩阵上的每个值与相应的单元格模式进行比较。

I = imread('DSM.tif');
c = mat2cell(I, [100,100,100,100,100], [100,100,100,100,100])
for i=1:5
    for j=1:5
        mode_cell = mode(c{i,j}(:))
    end
end

我做了这个代码:

modes = cellfun(@(x) mode(x(:)), c, 'UniformOutput', false);
modes = cell2mat(cellfun(@(x) mode(x(:)), c, 'UniformOutput', false));
for i = 1 :5
for j =1 :5
    for i2=1 :100
        for j2=1 :100
            cell = c{i,j};
            if cell(i2,j2)<modes(i,j)
                teste(i,j)=0;
            else
                teste(i,j)=1;
            end
        end
    end
end
end

但使用此代码,矩阵 teste 仅为 100x100。我想附上所有的睾丸矩阵,最后我想要一个 500x500 的矩阵。我该怎么做?

【问题讨论】:

  • 使用 for 循环或 cellfun,随心所欲。
  • 我已经有了每个单元格的模式。但是如何将每个矩阵 100x100 的值与对应的单元格模式进行比较呢?
  • 提问的时候,请说清楚你已经明白了什么,你需要什么。现在您收到了一个答案和一条评论,解释了如何执行您已经实施的操作。
  • 是的,我知道,对此感到抱歉。我意识到这一点并编辑了问题。

标签: matlab matrix cells


【解决方案1】:

编辑:根据您的问题更新更新答案

浓缩解决方案(+):

%// data
I = imread('DSM.tif');
c = mat2cell(I, [100,100,100,100,100], [100,100,100,100,100])
    %// 5x5 cell matrix with 100x100 data entries

%// solution
teste = cell2mat(cellfun(@(x) bsxfun(@ge, x, mode(x(:))), c, 'UniformOutput', false));
    %// 500x500 logical matrix

解释:

如前所述(请参阅下面的上一个答案),使用 cellfun 命令,但包含 'UniformOutput', false' 名称-值对,以便生成的 modes 是 5x5 单元格 em> 矩阵(而不是值矩阵)。计算模式后,使用后续的cellfun 调用根据您的规范计算逻辑。

%// data
I = imread('DSM.tif');
c = mat2cell(I, [100,100,100,100,100], [100,100,100,100,100])
    %// 5x5 cell matrix with 100x100 data entries

%// modes: 5x5 cell matrix with single value entries (mode)
modes = cellfun(@(x) mode(x(:)), c, 'UniformOutput', false);

%// teste: 5x5 cell matrix with 100x100 logical (0/1) entries 
teste = cellfun(@ge, c, modes, 'UniformOutput', false);

teste 中的逻辑描述,对于每个100x100 数据块中的每个值,如果该值小于对应块的模式值:

0 : values in block less than block mode,
1 : values greater or equal to block mode.

最后,如果您想将5x5 单元格数组teste(每个单元格包含100x100 逻辑条目)转换为单个500x500 逻辑矩阵,您可以使用cell2mat 命令,应用于单元矩阵teste:

testeSingleValueMatrix = cell2mat(teste)
    %// 500x500 logical matrix

现在,通过在单个cellfun 中包含bsxfun 命令,我们可以将上述内容归结为一行;上面(+)给出的浓缩解,即

teste = cell2mat(cellfun(@(x) bsxfun(@ge, x, mode(x(:))), c, 'UniformOutput', false));
    %// 500x500 logical matrix

在原始问题的编辑之前回答(计算模式并分配到一个值矩阵)

你可以使用cellfun命令

myCellMatrix = ... %// 5x5 cell matrix with 100x100 data entries
modes = cellfun(@(x) mode(x(:)), myCellMatrix);

输出将是一个 5x5 值矩阵,其中包含每个 100x100 数据集的模式。

【讨论】:

  • 为什么统一输出为假?该函数返回一个标量。 +1 以获得在编辑之前对原始问题的良好回答。
  • 我已经有了每个单元格的模式。但是如何将每个矩阵 100x100 的值与对应的单元格模式进行比较呢?
  • @PedroMarques 我不在家,只在移动设备上;我明天可以重新查看这个问题(在您编辑之后),除非在那之前有人为您回答。
  • @dfri 非常感谢您的帮助。我已经对问题进行了一些更改。
  • 乐于助人。我已经更新了我的答案以涵盖您的问题的编辑(计算teste 的逻辑)。请注意,teste 的完整计算最终可以在一行中执行,使用cellfun 命令(与bsxfun 结合使用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多