Getting values from 4d matrix according (using) 2d matrix with logical values (0 or 1) - does not work as wanted
2 次查看(过去 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!