matlab - 从元胞数组中提取内容

标签 matlab cell-array

我有一系列图像,存储在数组 A 中。因此 A 的每个条目都包含一个图像(矩阵)。所有矩阵的大小相同。

现在我想提取特定位置(像素)的值,但我当前的方法似乎很慢,我认为可能有更好的方法来做到这一点。

% Create data that resembles my problem
N = 5
for i = 1:N
A{i} = rand(5,5);
end

% my current approach
I = size(A{1},1);
J = size(A{1},2);
val = zeros(N,1);
for i = 1:I
    for j = 1:J
        for k = 1:N
            B(k) = A{k}(i,j);
        end
        % do further operations on B for current i,j, don't save B
    end
end

我认为应该有一些类似于 A{:}(i,j)vertcat(A{:}(i,j)) 的方法> 但两者都会导致

??? Bad cell reference operation.

我使用的是Matlab2008b。

有关更多信息,我随后在 B 上使用 fft。

以下是 Cris 的回答结果

|     Code     | # images | Extracting Values |   FFT    |  Overall  |
|--------------|----------|-------------------|----------|-----------|
| Original     | 16       | 12.809 s          | 19.728 s | 62.884 s  |
| Original     | 128      | 105.974 s         | 23.242 s | 177.280 s |
| ------------ | -------- | ----------------- | -------  | --------- |
| Answer       | 16       | 42.122 s          | 27.382 s | 104.565 s |
| Answer       | 128      | 36.807 s          | 26.623 s | 102.601 s |
| ------------ | -------- | ----------------- | -------  | --------- |
| Answer (mod) | 16       | 14.772 s          | 27.797 s | 77.784 s  |
| Answer (mod) | 128      | 13.637 s          | 28.095 s | 83.839 s  |

答案代码已修改为 double(squeeze(A(i,j,:))); 因为没有 double,FFT 需要更长的时间。

答案(mod)使用double(A(i,j,:));

因此,对于较大的图像集来说,改进似乎确实有效,但我目前计划每次运行处理约 500 个图像。

更新

使用profile函数测量,使用/省略squeeze的结果

|              Code              | # Calls |   Time   |
|--------------------------------|---------|----------|
| B = double(squeeze(A(i,j,:))); | 1431040 | 36.325 s |
| B= double(A(i,j,:));           | 1431040 | 14.289 s |

最佳答案

A{:}(i,j) 不起作用,因为 A{:} 是逗号分隔的元素列表,相当于 A{ 1},A{2},A{3},...A{end}。对这样的数组进行索引是没有意义的。

为了加快操作速度,我建议您根据数据创建 3D 矩阵,如下所示:

A3 = cat(3,A{:});

当然,只有当 A 的所有元素都具有相同的大小(如问题中最初指定的那样)时,这才有效。

现在您可以像这样快速访问数据:

for i = 1:I
    for j = 1:J
        B = squeeze(A3(i,j,:));
        % do further operations on B for current i,j, don't save B
    end
end

根据应用于每个 B 的操作,您也可以对这些操作进行矢量化。

编辑:由于您将 fft 应用于每个 B,因此您也可以在不循环的情况下获得它:

B_fft = fft(A3,[],3); % 3 is the dimension along which to apply the FFT

关于matlab - 从元胞数组中提取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51862259/

相关文章:

matlab - 这个函数定义 SomeFunction(hObject,~) 在 Matlab 中意味着什么?

c - 从 MATLAB 访问在 MEX 中创建的稀疏矩阵

matlab - 连接远程Matlab : local GUI, 远程代码

Matlab:如何将元胞数组转换为字符串数组?

matlab - 将单元格元素打印到文本文件

c++ - OpenCV convexhull 没有给出正确的输出

arrays - Matlab reshape 水平猫

string - 在 MATLAB 中,如何在元胞数组中的每个字符串的开头插入一个字符串?

Matlab将柱状数据转化为ndarray

matlab - 注释某些行时 Matlab 中的单元格数组串联错误