Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我经常发现自己想使用自定义函数在一个维度上折叠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算术运算符被设计为在矩阵上以元素方式进行运算 。例如,函数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 更多&回答... |
![]() |
![]() |