Saya memiliki matriks A berukuran 1x10575 dan matriks lain B berukuran 13462x30974. Semua nilai A adalah anggota B. Saya ingin mendapatkan matriks baru C berukuran 13462x10575 dengan ketentuan sebagai berikut.

Jika nilai B adalah anggota A, maka kembalikan semua nilai di kolom masing-masing B. Jika A bukan anggota B maka jangan hormati kolom ini lagi.

Ini akan menjadi contoh bagaimana matriks bisa terlihat seperti:

A = [1 2 3 4 5 6; 11 12 13 14 15 16; 21 22 23 24 25 26];
B = [1 2 5 6];

Outputnya akan terlihat seperti:

C = [1 2 5 6; 11 12 14 15; 21 22 24 25];

Saya mencoba kode berikut, namun mengembalikan output C dalam format yang salah (1x417281728).

[isMatch, index] = ismember(B(1, :), A);
C = nan(size(B, 1), numel(A));
C(:, index(isMatch)) = B(:, isMatch);
0
Joe 9 November 2017, 18:16

1 menjawab

Jawaban Terbaik

Yang pada dasarnya ingin Anda lakukan adalah sebagai berikut: "Untuk setiap elemen dalam larik A, periksa apakah elemen ini ada di B, lalu kembalikan seluruh kolom." Jadi tebakan Anda dengan ismember sepenuhnya benar, karena Anda ingin memeriksa apakah A adalah anggota B. Misalnya, hasilnya adalah:

1 1 0 0 1 1
0 0 0 0 0 0
0 0 0 0 0 0

Jadi, Anda harus menciutkan semua indeks ini ke dalam satu larik, yang menyatakan bahwa setidaknya ada satu anggota yang memiliki biner 1. Ini dapat Anda lakukan dengan menggunakan perintah any, yang pada dasarnya memeriksa apakah ada di setidaknya satu TRUE dalam dimensi yang dipertimbangkan. Jadi pada akhirnya Anda berakhir dengan:

C = A(:,any(ismember(A,B),1))

[Perhatikan bahwa dalam contoh Anda, Anda telah mengubah A dan B, jadi dalam kode yang saya posting juga diubah].

2
Richard 9 November 2017, 16:36