I have the folowing:
vector=[1 3 8 9];
matrix=[ 100 1 5 9 6; 100 10 13 3 8; 100 9 10 1 4; ];
% I want to search and replace the vector element with "0"in the matrix (i.e new matrix should be : Newmatrix=[ 100 0 5 0 6; 100 10 13 0 0; 100 0 10 0 4; ]; )
The script is:
Newmatrix=zeros(size(matrix));
for i=1:numel(matrix)
for j=1:length(vector)
valvect=vector(j);
if matrix(i)==valvect
Newmatrix(i)=0;
else
Newmatrix(i)=matrix(i);
end
end
end
The results is not the desired one but:
Newmatrix=100 1 5 0 6
100 10 13 3 8
100 0 10 1 4
So what I'm doing wrong?
Thank you

댓글 수: 1

Mike Lynch
Mike Lynch 2020년 11월 24일
The accepted answer or changem are cleaner and more compact, but for the code you wrote the addition of a "break" should fix the problem.
if matrix(i)==valvect
Newmatrix(i)=0;
break
else ...

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

 채택된 답변

Youssef  Khmou
Youssef Khmou 2013년 3월 3일

0 개 추천

hi, try ;
F=matrix;
for i=1:length(vector)
F(F==vector(i))=0;
end

댓글 수: 5

Ionut  Anghel
Ionut Anghel 2013년 3월 3일
Thank you. Very efficient
BJ Anderson
BJ Anderson 2019년 3월 12일
See the comments below about changem, which is the most versatile and efficient tool for such problems.
In general, you should be avoiding loops in MATLAB, and changem is the thought-out implementation that does just that.
Another option that avoids a loop is 'ismember':
matrix(ismember(matrix,vector))=0;
The ismember function in this case returns a logical array the same size as matrix, with 1s wherever it finds a member of vector, and zero otherwise. It is implemented here as an indexing array, so now all elements in matrix where the above condition is true is set to 0--or whatever arbitrary value you need.
Stephen23
Stephen23 2019년 3월 12일
"In general, you should be avoiding loops in MATLAB"
Why ?
Joel Bly
Joel Bly 2019년 4월 11일
@BJAnderson how do I change the 1s that come from the ismember function back to the values they are referring to, without changing the zeros?
If you use ismember() with two outputs, then the second output is the index at which the element in the first parameter appears in the second parameter. In places that the element does not occur, then the returned value will be 0 there. You can select just the valid indices by indexing the second output by the first output.
[is_it_there, idx] = ismember(A, B);
idx(is_it_there)

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

추가 답변 (4개)

Metin Ozturk
Metin Ozturk 2018년 8월 1일

1 개 추천

The more vectorized and easier way to do this could be as follows:
new_matrix = changem(matrix,zeros(length(vector),1),vector);

댓글 수: 2

BJ Anderson
BJ Anderson 2019년 3월 12일
YES YES YES. It looks like hardly anyone knows about changem...I see similar questions asked and typically the "solution" involves a loop. A loop in MATLAB is the first sign you're doing something wrong.
changem covers so many situations, and it is elegant and concise, not to mention avoids the risk of re-reassigning an element.
changem is almost always the right anwer. Let the world know!
Thanks Metin for helping to spread the word.
BJ Anderson
BJ Anderson 2019년 3월 12일
A quick update on changem:
Sadly, if one inspects the actual code within changem, it functions as a loop. While it is a handy one-liner, it does not have the time-savings of moving from a looped function to an matrix-operation function.

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

Bruno Luong
Bruno Luong 2019년 3월 12일

1 개 추천

F = matrix .* ~ismember(matrix,vector)
Walter Roberson
Walter Roberson 2013년 3월 3일

0 개 추천

Suppose you set Newmatrix to 0 because matrix matched vector(1). Now what happens when you go on to the next j to test if matrix matched vector(2) ?
Image Analyst
Image Analyst 2013년 3월 3일

0 개 추천

Try it this way:
newMatrix = matrix % Initialize
for k = 1 : length(vector)
newMatrix(matrix==vector(k)) = 0
end

카테고리

도움말 센터File Exchange에서 Data Type Identification에 대해 자세히 알아보기

질문:

2013년 3월 3일

댓글:

2020년 11월 24일

Community Treasure Hunt

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

Start Hunting!

Translated by