how to filter columns

조회 수: 10 (최근 30일)
AIRTON
AIRTON 2025년 9월 12일
댓글: Stephen23 2025년 9월 17일
Hello friends,
I have this script. But is very slow!
I want to filter all columns beginning with column first. After that, I want, in the place of column first, to put the second column and, in the place of column second to put the column first and filter again. And go on!
My purpose is decrease the time!
Thanks by support!
clear all
clc
q = 1;
p = 2;
r1 = 1;
r2 = 1;
tic
% Example: Filtering a matrix
load ('tum.mat'); % tum have 576 x 1000
for i1 = 1:1000
% Filter rows where the first column is greater than 15
z1 = k2(k2(:,1) == 0, :);
s1 = sum(z1, 1);
r(r1,r2) = max(s1);
temp_row = k2(:,q);
k2(:,q) = k2(:,p);
k2(:,p) = temp_row;
p = p + 1;
r1 = r1 + 1;
end
toc
Elapsed time is 337.582496 seconds.
  댓글 수: 6
Image Analyst
Image Analyst 2025년 9월 13일
If k2 is a matrix of random numbers, you will never have the numbers be zero so this won't work
k2(:,1) == 0 % Will never happen!
Matt J
Matt J 2025년 9월 14일
Elapsed time is 337.582496 seconds.
It does seem impossible for such a small loop to be that slow. Certainly everything excluding the load() statement is very fast, as illustrated in my timing comparison below.
The only explanation I can think of is that you have additional variables in tum.mat that are getting loaded, and which are a lot larger than k2. Or, you are loading from a super slow hard drive.

댓글을 달려면 로그인하십시오.

답변 (1개)

Matt J
Matt J 2025년 9월 13일
편집: Matt J 2025년 9월 13일
m=576;
n=1000;
k2=randi([0,1],m,n).*rand(m,n);
tic;
r=max( (k2==0)'*k2 ,[],2);
toc;
Elapsed time is 0.024019 seconds.
  댓글 수: 5
AIRTON
AIRTON 2025년 9월 16일
Hello Matt
excuse me go back with my doubt. You gave this script:
clear all
clc
n=20;
load ('w2.mat');
q = 1;
p = 1;
r1 = 1;
r2 = 1;
for i1 = 1:n
% Filter rows where the first column is equal 0
z1 = w2(w2(:,1) == 0,:);
s1 = sum(z1, 1);
r(r1,r2) = max(s1);
p = mod(p,n)+1;
temp_row = w2(:,q);
w2(:,q) = w2(:,p);
w2(:,p) = temp_row;
r1 = r1 + 1;
end
It has worked well with my w2.mat file.
I want to gain the same result with w3.mat file, however without transposing it.
is it possible?
I have loaded the files!
thanks!
Stephen23
Stephen23 2025년 9월 17일
@AIRTO: using numbered variables like that is a mistake. Much better to use one container array and indexing:
S = dir('./w*.mat');
for k = 1:numel(S)
F = fullfile(S(k).folder,S(k).name);
C = struct2cell(load(F));
M = C{1}; % this is your matrix.
... do whatever you want with your matrix
S(k).r1 = r1; % save whatever values you want
end

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Multidimensional Arrays에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by