Hi,
I have two large matrices with the same number of rows but a different number of columns. Let's say A is the larger matrix and B is the smaller one.
Values in each row of the matrix B are a subset of the values of the corresponding row in A. The goal is to have another matrix C which in each row contains the values from the corresponding row of A which are not in corresponding row of B. In other words, I want to use the setdiff(A,B) command, but it should act row by row. Any idea how can I do this without looping?
Thank you!

Antworten (2)

Guillaume
Guillaume am 18 Mär. 2016
Bearbeitet: Guillaume am 18 Mär. 2016

0 Stimmen

I'm afraid there's no other way than looping over the rows either explicitly with a for loop, or with cellfun:
cell2mat(cellfun(@setdiff, num2cell(A, 2), num2cell(B, 2), 'UniformOutput', false))
Note that the above assumes that setdiff returns the same number of elements for each row. Otherwise, you'll have to get rid of the cell2mat call and keep the result as a cell array.
Also, note that an explicit loop may be faster as you wouldn't have to split the inputs into cell arrays of rows.

1 Kommentar

Mahmoud Zeydabadinezhad
Mahmoud Zeydabadinezhad am 18 Mär. 2016
That's unfortunate as looping over for millions of times takes absolute ages to complete.

Melden Sie sich an, um zu kommentieren.

Fangjun Jiang
Fangjun Jiang am 18 Mär. 2016

0 Stimmen

setdiff(a,b,'rows') ??

4 Kommentare

Guillaume
Guillaume am 18 Mär. 2016
No, that's not what the 'rows' option does. It treats each row as a single entity and return the rows that are not found in the second matrix. Even if it didn't error, this is not what is asked. It returns an error in any case, since with 'rows' the rows must have the same number of columns.
Yakubu
Yakubu am 24 Apr. 2018
Hi, I am curious to know whether you were able to solve the problem eventually because I am stuck with similar problem myself and am wondering if I could benefit from your experience.
Fangjun Jiang
Fangjun Jiang am 24 Apr. 2018
just use setdiff(A(k,:), B(k,:)) and loops through all rows. What is the point to struggle to avoid a loop?
Shuhao Cao
Shuhao Cao am 7 Mai 2020
Because loop is slow for large matrices (especially the sparse matrices).

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Hilfe-Center und File Exchange

Kommentiert:

am 7 Mai 2020

Community Treasure Hunt

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

Start Hunting!

Translated by