Path: news.mathworks.com!not-for-mail
From: <HIDDEN>
Newsgroups: comp.soft-sys.matlab
Subject: Re: conditional column delete (3D matrix)
Date: Thu, 11 Oct 2012 16:56:07 +0000 (UTC)
Organization: The MathWorks, Inc.
Lines: 29
Message-ID: <k56tn7$qf1$1@newscl01ah.mathworks.com>
References: <k56mih$rv3$1@newscl01ah.mathworks.com>
Reply-To: <HIDDEN>
NNTP-Posting-Host: www-00-blr.mathworks.com
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: newscl01ah.mathworks.com 1349974567 27105 172.30.248.45 (11 Oct 2012 16:56:07 GMT)
X-Complaints-To: news@mathworks.com
NNTP-Posting-Date: Thu, 11 Oct 2012 16:56:07 +0000 (UTC)
X-Newsreader: MATLAB Central Newsreader 1187260
Xref: news.mathworks.com comp.soft-sys.matlab:780458

"Thomas" wrote in message <k56mih$rv3$1@newscl01ah.mathworks.com>...
> I know how to accomplish this with a 2-D matrix, but I am having trouble with the syntax to apply to a 3-D matrix
> 
> 2-D example: Let's say A is a 10x5 matrix.
> If any column of A meets a criterion, I want to delete the whole column. If my criterion is any element greater than 10, I can do this:
> A = rand(10,5)*10; A(3,2) = 11; A(5,4) = 12; % create matrix
> A(:,max(A)>10) = []; % delete the two columns containing number > 10
> I'm left with a 10x3 matrix comprising the original columns 1, 3 and 5.
> 
> But, what if it's a 10x5x2 matrix. Same criterion, but now, when criterion is met, I want to delete columns across both levels of the 3rd dimension. (That is, my goal is a 10x3x2). 
> Note, the criterion would apply to either level of the 3rd dimension. So...
> B = rand(10,5,2)*10; B(3,2,1) = 11; B(5,4,2) = 12;
> Columns 2 and 4 meet the criterion regardless of whether the location of the criterion-meeting number is in (:,:,1) or (:,:,2).
> The logic from the 2-D examples above led me to think that something like this should work:
> B(:,max(B)>10,:) = [];
> But no joy. I get 'Matrix index is out of range for deletion.' I've tried several other variants and I can't quite get it. Suggestions? Thanks,
> -Tom
- - - - - - - - - - - -
  How about using the 'any' function?

 B(:,any(any(B>10,2),3),:) = [];

Or perhaps it should be:

 B(:,any(any(B>10,2),2),:) = [];

if the inner 'any' result collapses to a true two-dimensional array.  I haven't tried this out.

Roger Stafford