Getting values from 4d matrix according (using) 2d matrix with logical values (0 or 1) - does not work as wanted
10 ビュー (過去 30 日間)
古いコメントを表示
Hello!
Let say I have a matrix A of dimensions (50*100*248*20) with data and I have another one B (50*100) with logical values (lets image I have 100 of "1") and I want to get values from my 4D matrix according to B. So I am doing
C = A(B);
But then I am getting my values only from A (:,:,1,1) - first page, but I am expecting to get values from all the pages (along all the 3rd and 4 th dimensions). How can I do this?
So I need at the output a matrix with dimensions (100, 1, 248, 20) - which give me 100 values from each page of 248*20
If I am not clear, let me know!, Hoping for you help! Thanks!
6 件のコメント
madhan ravi
2019 年 4 月 4 日
編集済み: madhan ravi
2019 年 4 月 4 日
Indeed sir Walter, thank you for the explanation just noticed the comment.
Linus Olofsson
2020 年 6 月 24 日
編集済み: Linus Olofsson
2020 年 6 月 24 日
Could someone please give an example of the explanation Walter gave above? I do not really understand how this is a solution of the problem, nor do I understand the code snippet provided by the earlier comment by Walter.
Could the solution please be explained with my very similar non-functional problem with a 3 channel color image and a 2 dimensional logical array (mask) that I would like to use to color code speficic parts of my image, i.e.:
image = zeros(150,5370,3);
whos mask
Name Size Bytes Class Attributes
mask 150x5370 805500 logical
image(mask,2) = 255; % Change the masked part of the image to be green.
採用された回答
Yurii Iotov
2019 年 3 月 29 日
3 件のコメント
Walter Roberson
2019 年 3 月 29 日
I think you mean that Zeros are only to be removed at the edges.
The code I posted here finds the bounding box that contains all of the 1's. It could easily be extended to more dimensions.
その他の回答 (1 件)
Darren Wethington
2019 年 3 月 29 日
See if this is what you're looking for:
A = rand(10,20,30,40);
B = round(rand(10,20));
four_dim_logical = zeros(size(A));
for i=1:length(four_dim_logical(1,1,:,1))
for j=1:length(four_dim_logical(1,1,1,:))
four_dim_logical(:,:,i,j) = B;
end
end
C = A(logical(four_dim_logical));
dim1 = sum(B(:));
dim2 = 1;
dim3 = size(A,3);
dim4 = size(A,4);
C = reshape(C,dim1,dim2,dim3,dim4);
2 件のコメント
Darren Wethington
2019 年 3 月 29 日
Just saw solutions in the comments. This solution will be MUCH more computationally expensive if either of those work.
参考
カテゴリ
Help Center および File Exchange で Loops and Conditional Statements についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!