Getting many outputs using blockproc

3 ビュー (過去 30 日間)
Youssra
Youssra 2015 年 7 月 18 日
回答済み: Eric Chadwick 2018 年 3 月 21 日
I want to apply SVD for each 4*4 blocks using the "blockproc" and get 3 outputs: U, S and V so I can reconstract all blocks together again but Matlab gets me "too many ouput arguments". How can I solve this problem?
fun = @(block_struct) svd(block_struct.data);
[U S V] = blockproc(a, [4 4], fun)
This is the error that I have:
Error using blockproc
Too many output arguments.

採用された回答

Walter Roberson
Walter Roberson 2015 年 7 月 18 日
No, this is not possible with blockproc().
You can use something like
function 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];
end
this returns a 12 x 4 array that can be broken up again into U, S, V.
  3 件のコメント
Walter Roberson
Walter Roberson 2015 年 7 月 21 日
Did you change the
function r =
to
function img_back =
?
Youssra
Youssra 2015 年 7 月 21 日
No, I didn't. I just add this line to be sure if I will get the original values from returned U, Spad and Vpad. just like that:
function 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'
end
I get a matrix with the same size as the original but not the same values. is this wrong?

サインインしてコメントする。

その他の回答 (2 件)

Brett Shoelson
Brett Shoelson 2017 年 8 月 15 日
編集済み: Walter Roberson 2017 年 8 月 15 日
Walter is correct that blockproc returns a single output. For clarity, though, it's worth pointing out that you can make n separate calls to blockproc, requesting args 1--n. That's tricky to do with a one-line function handle, but easy if you create a single-output function for each output that you want to generate, and call them sequentially for the image. (Not ideal, but maybe helpful.)
For instance, if you wanted to calculate the thresholdOutput of the edge(img,'LOG') function:
[~,threshOut] = edge(img,'LOG');
you could create a function called, for example, calculateEdgeThresh, with a syntax like:
function thresh = calculateEdgeThresh(img)
[~,thresh] = edge(img,'LOG');
then (in pseudo-code):
localEdgeFcn = @(x) edge(x.data,'LOG');
threshFcn = @(x) calculateEdgeThresh(x.data);
localEdge = blockproc(img,localEdgeFcn); %This one is a one-liner, via function handle
localThresh = blockproc(img,threshFcn); %This one requires the separate calculateEdgeThresh function
Cheers,
Brett
  3 件のコメント
Walter Roberson
Walter Roberson 2018 年 3 月 20 日
Eric, your function does not return anything, and certainly not multiple outputs for each block. Your function name suggests that it just counts, rather than it calculating a revised block?
Image Analyst
Image Analyst 2018 年 3 月 20 日
Eric, blockproc() stitches it back together automatically. See my attached demos.

サインインしてコメントする。


Eric Chadwick
Eric Chadwick 2018 年 3 月 21 日
Hello, thank you both for responding so quickly! My function does have outputs, I just did not show them when I showed my function to you. However when I went to copy and paste it just now, I realized I wasn't telling it to output the image my function normally outputs. Adding the image as an output has solved the problem.
Thank you both!
Cheers,
Eric

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by