使用BlockProc获取许多输出

7次观看(最近30天)
我想使用“ blockProc”对每个4*4个块应用SVD,并获得3个输出:u,s和v,以便我可以再次将所有块重新合在一起,但是MATLAB让我“太多的uput grim gruments”。我怎么解决这个问题?
fun = @(block_struct)svd(block_struct.data);
[U S V] = BlockProc(A,[4 4],Fun)
这是我的错误:
错误使用BlockProc
许多输出参数。

接受的答案

沃尔特·罗伯森(Walter Roberson)
不,对于BlockProc(),这是不可能的。
您可以使用类似的东西
功能r = blocksvd(block_struct)
[u,s,v] = svd(block_struct.data);
spad = nan(size(u));
vpad = spad;
spad(1:size(s,1),1:size(s,2))= s;
vpad(1:size(u,1),1:size(u,2))= u;
r = [u;spad;vpad];
结尾
这返回一个12 x 4的数组,可以再次分解为u,s,v。
3条评论
Youssra
Youssra 2015年7月21日
不,我没有。我只是添加此行,以确保我是否会从返回的U,Spad和VPAD中获取原始值。就是这样:
功能r = blocksvd(block_struct)
[u,s,v] = svd(block_struct.data);
spad = nan(size(u));
vpad = spad;
spad(1:size(s,1),1:size(s,2))= s;
vpad(1:size(u,1),1:size(u,2))= u;
r = [u;spad;vpad];
img_back = u*spad*vpad'
结尾
我得到的矩阵大小与原始值相同,但不相同的值。这是错误的吗?

登录发表评论。

更多答案(2)

布雷特·肖尔森(Brett Shoelson)
编辑:沃尔特·罗伯森(Walter Roberson) 2017年8月15日
Walter是正确的,BlockProc返回单个输出。但是,为了清楚起见,值得指出的是,您可以对BlockProc进行单独的呼叫,要求Args 1-n。使用单行函数句柄很难做到,但是如果您为要生成的每个输出创建一个单输出功能,请简单,并将其顺序称呼为图像。(不是理想的,但也许有帮助。)
例如,如果要计算边缘(IMG,'log')函数的阈值:
[〜,threshout] = edge(img,'日志');
您可以创建一个称为称为“计算”语法的函数,例如:
功能阈值=计算gethresh(img)
[〜,阈值] = edge(img,'日志');
然后(在伪代码中):
localedgefcn = @(x)edge(x.data,'日志');
threshfcn = @(x)计算edgethresh(x.data);
localEdge = blockProc(img,localedgefcn);%这个是单线,通过函数手柄
localthresh = blockProc(img,threshfcn);%这个需要单独的计算函数
干杯,
布雷特
3条评论
图像分析师
图像分析师 2018年3月20日
Eric,BlockProc()自动将其缝合在一起。请参阅我所附的演示。

登录发表评论。


埃里克·查德威克(Eric Chadwick)
您好,谢谢你们俩如此迅速的回应!我的功能确实具有输出,当我向您展示我的功能时,我只是没有显示它们。但是,当我现在复制并粘贴它时,我意识到我并没有告诉它输出图像正常输出。将图像添加为输出已解决了问题。
谢谢你们俩!
干杯,
埃里克

社区寻宝

在Matlab Central中找到宝藏,发现社区如何为您提供帮助!

开始狩猎!