make true statements return value that it is associated with

조회 수: 9 (최근 30일)
Joel Bly
Joel Bly 2019년 4월 12일
댓글: Guillaume 2019년 4월 16일
So I'm basically trying to get the values of the intersects of 2 matrices in the same position on the matrix they were previously. I'm trying to do this with a huge 350 row data set that has 4 columns. I already have a for loop to set up for the intersect values as well as using ismember function to know whether there is a duplicate that exist in a certain position. here's what comes out of both values.
O(1,:) = 12.7 0 0 0
L(1,:) = 0 1 0 0
Now all that's left is moving the 12.7 value to where the 1 value is without changing the 0's in the L matrix. and I want to do it with the entire data set. I know I would need another loop, but I don't even know how to go about doing this. and there hasn't been a question on here comparable to my problem. PLEASE HELP.
I HAVE BEEN AT IT FOR LIKE 2 WEEKS!!!!! I'm DYING INSIDE
  댓글 수: 3
Geoff Hayes
Geoff Hayes 2019년 4월 12일
And I suppose row two would be different? (i.e. 1 is replaced with some other number) Or are all ones replaced with 12.7?
Joel Bly
Joel Bly 2019년 4월 12일
편집: Joel Bly 2019년 4월 12일
my desired output is literally
somevariable = 0 12.7 0 0
everytime there's a number that is an intersection. ismember shows 1. Each number would be different.
so if the result is this:
somevariable = 1 0 1 0
two = 6 7 0 0
desiredvar = 6 0 7 0
that's what I want, but I don't know how to get there

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

답변 (2개)

Walter Roberson
Walter Roberson 2019년 4월 12일
편집: Walter Roberson 2019년 4월 12일
desiredvar = zeros(size(somevariable), class(two));
ind = find(somevariable == 1);
desiredvar(ind) = two(1:length(ind));
In the special case where somevariable is already logical, you could also write
desiredvar = zeros(size(somevariable), class(two));
desiredvar(somevariable) = two(1:nnz(somevariable));
You have not really defined what you want to have happen if somevariable and two are not the same length.
  댓글 수: 3
Joel Bly
Joel Bly 2019년 4월 15일
so if I do it for just one row, it works, but not for all rows. How do i do it so that I make it work for all 348 rows in the 4 column matrix
Walter Roberson
Walter Roberson 2019년 4월 15일
nrow = size(O, 1);
ncol = size(O, 2);
output = zeros(nr, ncol);
srccol = 1 * ones(nr, 1);
for C = 1 : ncol
mask = find(L(:,C) == 1);
ind = sub2ind([nrow, ncol], mask, srccol(mask));
output(mask, C) = O(ind);
srccol(mask) = srccol(mask) + 1;
end
I think it would be possible to do without a loop, but I don't think it is worth doing.

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


Guillaume
Guillaume 2019년 4월 12일
편집: Guillaume 2019년 4월 12일
" I already have a for loop to set up for the intersect values "
It's very likely that a loop is not needed at all. Show us that code to know for sure.
"Now all that's left is moving the 12.7 value to where the 1 value is without changing the 0's [...] I know I would need another loop"
No, loop absolutely not needed:
O = [12.7 0 0 0];
L = [0 1 0 0]; %double or logical
L(logical(L)) = O(1:nnz(L)); %if L is of class double
L(L) = O(1:nnz(L)); %if L is logical
  댓글 수: 4
Joel Bly
Joel Bly 2019년 4월 15일
weird tone in the writing but yeah it did not give me the result I wanted at all because I'm doing them for multiple rows of the matrix. yours only did the top row and messed up everything else. So it's not exactly the fact it didn't work, but rather that it didn't do what I needed it to do. Please refrain from using aggressive tone. Unless I'm reading that wrong. pretty please.
Guillaume
Guillaume 2019년 4월 16일
You wrote (unfortunately, not valid matlab, so we have to interpret):
so if the result is this:
somevariable = 1 0 1 0
two = 6 7 0 0
desiredvar = 6 0 7 0
that's what I want, but I don't know how to get there
>> somevariable = [1 0 1 0];
>> two = [6 7 0 0];
>> desiredvar = somevariable;
>> desiredvar(logical(desiredvar)) = two(1:nnz(desiredvar))
desiredvar =
6 0 7 0
How did that not do what you ask?
Now, if you need the same for each row of a matrix, then give an example, using valid matlab syntax so there's no ambiguity, of the matrices inputs (and corresponding desired output).
The above can always be wrapped in a loop operating on each row of the matrix obviously but most likely it can be done without a loop, e.g.:
tofill = [0 1 0 1;
1 1 0 0];
filler = [10 20 30 40]; %no idea if that's how your input is. Fill by ROW
tofill = tofill'; %matlab works on columns. So transpose
tofill(logical(tofill)) = filler(1:nnz(tofill)); %fill
tofill = tofill' %tranpose back

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

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by