Effacer les filtres
Effacer les filtres

How to find the find the pattern in each row of Matrix?

4 vues (au cours des 30 derniers jours)
Kazi Alam
Kazi Alam le 10 Juin 2021
Modifié(e) : Adam Danz le 10 Juin 2021
Hallo, Thanks for reading!
The array that I am working with consist of 8 column.
1 2 3 4 5 6 7 8
==========================================================
0 3.2 0 3.3 0 2 19 0
3.2 0 3.2 0 3.3 0 2 0
0 0 6.2 0 0 8 21 0
3.2 9 3.2 0 0 0 2 0
...
The goals is to find the column number which are non-zeros. For example: row1 = 2468, row2 = 1357, row3= 367 so on. With these I would like finally find out what is the most frequent pattern.
The current code is
for i=1:length(data)
k(i,:)= find(data(i,:)~=0);
end
However, my array is inconsistent how to solve this problem? Returning the following error:
Unable to perform assignment because the indices on the left side are not compatible with the size of the right side.

Réponse acceptée

Kazi Alam
Kazi Alam le 10 Juin 2021
Modifié(e) : Kazi Alam le 10 Juin 2021
Already found a better option!
Here is the code.
for i=1:length(outerwall)
k(:,i)= str2double(sprintf('%d',find(outerwall(i,:)~=0)));
end
Edit:
for more info
  1 commentaire
Adam Danz
Adam Danz le 10 Juin 2021
Modifié(e) : Adam Danz le 10 Juin 2021
This solution is bad for two reasons.
  1. Is very inefficient. It converts vectors to strings, then back to a numbers, and uses a loop, all of which can be avoided.
  2. Most importantly, this method will fail if there are more than 9 columns. Example: let's say the pattern in row j is [1 3] and the pattern in row k is [13]. That produces the same output "13" even though the 2 patterns have no overlap at all. Another example: what columns are represented by '123'? [1 2 3] or [1, 23] or [123]?
dpb's answer is much more efficient, cleaner, quicker, and robust.

Connectez-vous pour commenter.

Plus de réponses (1)

dpb
dpb le 10 Juin 2021
A=[A;A(3,:)]; % make sure one row has same pattern
% the engine
B=(A~=0); % convert to logical array for pattern, independent of value
[~,ib]=ismember(B,unique(B,'rows'),'rows'); % locations of each pattern
N=histcounts(ib); % count number of each pattern located
For the above augmented, array, this returns
>> N
N =
2 1 1 1
>>
which shows the first row was duplicated; all rest were unique, only occurring once.
  2 commentaires
Adam Danz
Adam Danz le 10 Juin 2021
Good one!
Kazi Alam
Kazi Alam le 10 Juin 2021
Thanks! I have found a better option. I will post it below.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by