Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:41   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 在MATLAB中在数组的单个维度上分布函数吗?

我经常发现自己想使用自定义函数在一个维度上折叠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函数(例如MEANMAXMINSUM等)被设计为可在特定维度上运行:

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

更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 01:15


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.