How to make a new matrix with all common arrays from different matrices

1 回表示 (過去 30 日間)
Moe
Moe 2014 年 11 月 11 日
編集済み: Andrei Bobrov 2014 年 11 月 12 日
Suppose I have some matrices as follow:
m1 = [1;2;3;4;5;6;7;8];
m2 = [2;3;4;6;7;8;9;10;11;12];
m3 = [4;5;6;7;8;9;1;;16];
m4 = [8;8;5;4;3;1;6;7];
I need a matrix which is included all common arrays in all matrices, such as:
m = [4;6;7;8];

回答 (3 件)

Azzi Abdelmalek
Azzi Abdelmalek 2014 年 11 月 11 日
編集済み: Azzi Abdelmalek 2014 年 11 月 11 日
m1 = [1;2;3;4;5;6;7;8];
m2 = [2;3;4;6;7;8;9;10;11;12];
m3 = [4;5;6;7;8;9;1;;16];
m4 = [8;8;5;4;3;1;6;7];
a=intersect(m1,m2)
b=intersect(m3,m4)
out=intersect(a,b)
  4 件のコメント
Moe
Moe 2014 年 11 月 11 日
Result of this code is:
a =
Empty matrix: 0-by-1
Azzi Abdelmalek
Azzi Abdelmalek 2014 年 11 月 12 日
Sorry
m1 = [1;2;3;4;5;6;7;8];
m2 = [2;3;4;6;7;8;9;10;11;12];
m3 = [4;5;6;7;8;9;1;;16];
m4 = [8;8;5;4;3;1;6;7];
m={m1,m2,m3,m4}
a=m{1}
for k=2:numel(m)
a=intersect(a,m{k})
end

サインインしてコメントする。


Star Strider
Star Strider 2014 年 11 月 11 日
編集済み: Star Strider 2014 年 11 月 12 日
I don’t know why you have to use a cell array, but then I’m only slightly familiar with what you’re doing.
Using eval is not considered good programming style, but this code may work for you. (It does do what you want.) You can make ‘M’ a cell array if you like, but keeping it numeric might be better:
m1 = [1;2;3;4;5;6;7;8];
m2 = [2;3;4;6;7;8;9;10;11;12];
m3 = [4;5;6;7;8;9;1;;16];
m4 = [8;8;5;4;3;1;6;7];
n = 4;
M = m1;
for k1 = 2:n
M = intersect(M,eval(['m' num2str(k1)]));
end
See if it works for you.
  6 件のコメント
Moe
Moe 2014 年 11 月 12 日
Thanks Star!
Can you give a example of that code way you mentioned? Because I have more than 1000 iterations and computational time is very important in my code as well!
Star Strider
Star Strider 2014 年 11 月 12 日
My pleasure!
I’m not certain that I understand exactly what you’re doing, but if you’re naming your vectors ‘m1’...‘m4’, use the code in my original answer (the eval loop) will sort them and take their intersections automatically.
You can wrap them in a function:
function M = vctintsct(m1,m2,m3,m4)
n = 4;
M = m1;
for k1 = 2:n
M = intersect(M,eval(['m' num2str(k1)]));
end
end
This works if you always have four vectors (you can name them anything in this instance, since the function will name them ‘m1’ etc.), then simply call the function as:
M = vctintsct(m1,m2,m3,m4);
and get ‘M’ as the output. It is a double-precision vector, but you can then assign it as an element of a cell array in your main script. If you have varying numbers of vectors, the function gets a bit more complicated but will still work.

サインインしてコメントする。


Andrei Bobrov
Andrei Bobrov 2014 年 11 月 12 日
編集済み: Andrei Bobrov 2014 年 11 月 12 日
m1 = [1;2;3;4;5;6;7;8];
m2 = [2;3;4;6;7;8;9;10;11;12];
m3 = [4;5;6;7;8;9;1;;16];
m4 = [8;8;5;4;3;1;6;7];
MM = {m1,m2,m3,m4};
z = cat(1,MM{:});
[a,~,c] = unique(z);
nn = cellfun(@numel,MM);
ii = accumarray(cumsum([1,nn])',1);% Idea by Roger Stafford
ii = cumsum(ii(1:end-1)); %
out = a(all(accumarray([c,ii],1),2));

カテゴリ

Help Center および File ExchangeMultidimensional Arrays についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by