arrays - 在 MATLAB 中将函数分布在数组的单个维度上?

标签 arrays matlab function matrix multidimensional-array

我经常发现自己想使用自定义函数在一个维度上折叠一个 n 维矩阵,但不知道是否有一个简明的咒语可以用来做到这一点。

比如在解析一张图片的时候,我经常想做这样的事情。 (注意!仅供说明性示例。我了解此特定案例的 rgb2gray。)

img = imread('whatever.jpg');
s = size(img);
for i=1:s(1)
  for j=1:s(2)
    bw_img(i,j) = mean(img(i,j,:));
  end
end

我很乐意将其表达为:

bw = on(color, 3, @mean);

bw(:,:,1) = mean(color);

有没有捷径可以做到这一点?


编辑:显然 mean 已经这样做了;我希望能够为我编写的任何函数执行此操作。例如,

...
  filtered_img(i,j) = reddish_tint(img(i,j,:));
...

在哪里

function out = reddish_tint(in)
  out = in(1) * 0.5 + in(2) * 0.25 + in(3) * 0.25;
end

最佳答案

许多基本的 MATLAB 函数,例如 MEAN , MAX , MIN , SUM等,旨在跨特定维度运行:

bw = mean(img,3);  %# Mean across dimension 3

您还可以利用 MATLAB arithmetic operators被设计为在矩阵上以元素方式操作。例如,您的函数 reddish_tint 中的操作可以通过这一行应用于图像的所有像素:

filtered_img = 0.5.*img(:,:,1)+0.25.*img(:,:,2)+0.25.*img(:,:,3);

要处理更一般的情况,即您想将函数应用于 N 维矩阵的任意维度,您可能希望编写您的函数,使其接受一个额外的输入参数,用于操作哪个维度(就像上面提到的 MATLAB 函数一样),然后使用一些简单的逻辑(即 if-else 语句)和逐元素矩阵运算将其计算应用于矩阵的适当维度。

虽然我不建议使用它,但 有一个快速而肮脏的解决方案,但它相当丑陋并且计算成本更高。您可以使用函数 NUM2CELL将沿数组维度的值收集到元胞数组的元胞中,然后使用函数 CELLFUN 将函数应用于每个元胞:

cellArray = num2cell(img,3);  %# Collect values in dimension 3 into cells
filtered_img = cellfun(@reddish_tint,cellArray);  %# Apply function to each cell

关于arrays - 在 MATLAB 中将函数分布在数组的单个维度上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2950838/

相关文章:

matlab - 如何生成非线性颜色图/颜色条?

excel - 在排序宏中使用 VBA 函数

ios - 如何在 block 内或 block 外打印完整数组?

java - 从项目文件夹内加载图像并在 jsf 弹出窗口中显示

php - 如何在 PHP 中将单个数组转换为多维数组?

c - 调用函数时一些数据从指针中消失

function - 在 Symfony2 中开发核心功能的最佳实践?

javascript - 在_.invoke源代码中,args的作用是什么?

matlab - 当用户定义的类是结构的字段时,覆盖其值的显示方式

matlab - 无法在 Windows 上编译 mex 文件