Getting values from 4d matrix according (using) 2d matrix with logical values (0 or 1) - does not work as wanted
    2 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Yurii Iotov
 el 29 de Mzo. de 2019
  
    
    
    
    
    Editada: Linus Olofsson
 el 24 de Jun. de 2020
            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 comentarios
  madhan ravi
      
      
 el 4 de Abr. de 2019
				
      Editada: madhan ravi
      
      
 el 4 de Abr. de 2019
  
			Indeed sir Walter, thank you for the explanation just noticed the comment.
  Linus Olofsson
 el 24 de Jun. de 2020
				
      Editada: Linus Olofsson
 el 24 de Jun. de 2020
  
			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.
Respuesta aceptada
  Yurii Iotov
 el 29 de Mzo. de 2019
        3 comentarios
  Walter Roberson
      
      
 el 29 de Mzo. de 2019
				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.
Más respuestas (1)
  Darren Wethington
 el 29 de Mzo. de 2019
        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 comentarios
  Darren Wethington
 el 29 de Mzo. de 2019
				Just saw solutions in the comments.  This solution will be MUCH more computationally expensive if either of those work.
Ver también
Categorías
				Más información sobre Matrix Indexing en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!





