Ale*_*man 7 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
Run Code Online (Sandbox Code Playgroud)
我想表达的是:
bw = on(color, 3, @mean);
Run Code Online (Sandbox Code Playgroud)
要么
bw(:,:,1) = mean(color);
Run Code Online (Sandbox Code Playgroud)
有一个简短的方法吗?
mean已经这样做了; 我希望能够为我编写的任何函数执行此操作.例如,
...
filtered_img(i,j) = reddish_tint(img(i,j,:));
...
Run Code Online (Sandbox Code Playgroud)
哪里
function out = reddish_tint(in)
out = in(1) * 0.5 + in(2) * 0.25 + in(3) * 0.25;
end
Run Code Online (Sandbox Code Playgroud)
许多基本的MATLAB函数,如MEAN,MAX,MIN,SUM等,旨在跨特定维度运行:
bw = mean(img,3); %# Mean across dimension 3
Run Code Online (Sandbox Code Playgroud)
您还可以利用MATLAB算术运算符设计为在矩阵上以元素方式运行的事实.例如,函数中的操作reddish_tint可以使用以下单行应用于图像的所有像素:
filtered_img = 0.5.*img(:,:,1)+0.25.*img(:,:,2)+0.25.*img(:,:,3);
Run Code Online (Sandbox Code Playgroud)
为了处理你想要将函数应用于N维矩阵的任意维度的更一般情况,你可能想要编写你的函数,使它接受一个额外的输入参数来操作哪个维度(如上所述) - 提到的MATLAB函数do)然后使用一些简单的逻辑(即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
Run Code Online (Sandbox Code Playgroud)