我经常发现自己想使用自定义函数在一个维度上折叠一个 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/