登录论坛

查看完整版本 : 在MATLAB中在数组的单个维度上分布函数吗?


poster
2019-12-10, 20:41
我经常发现自己想使用自定义函数在一个维度上折叠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 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/mean.html) , MAX (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/max.html) , MIN (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/min.html) , SUM (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sum.html)等)被设计为可在特定维度上运行:

bw = mean(img,3); %# Mean across dimension 3 您还可以利用以下事实: MATLAB算术运算符 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/arithmeticoperators.html)被设计为在矩阵上以元素方式进行运算 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/arithmeticoperators.html) 。例如,函数reddish_tint的操作可以通过以下这一行应用于图像的所有像素:

filtered_img = 0.5.*img(:,:,1)+0.25.*img(:,:,2)+0.25.*img(:,:,3); 为了处理更常见的情况,您想将函数应用于N维矩阵的任意维,您可能需要编写函数,使其接受一个要对其进行维操作的附加输入参数(例如上述代码)提到的MATLAB函数),然后使用一些简单的逻辑(即if-else语句)和逐元素矩阵运算将其计算应用于矩阵的适当维数。

尽管我不建议您使用它,但是有一个快速而又肮脏的解决方案,但是它很丑陋,并且计算上更昂贵。您可以使用函数NUM2CELL (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/num2cell.html)将沿数组维度的值收集到单元格数组的单元格中,然后使用函数CELLFUN (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/cellfun.html)将函数应用于每个单元格:

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

更多&回答... (https://stackoverflow.com/questions/2950838)