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

3 visualizaciones (últimos 30 días)
Kazi Alam
Kazi Alam el 10 de Jun. de 2021
Editada: Adam Danz el 10 de Jun. de 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.

Respuesta aceptada

Kazi Alam
Kazi Alam el 10 de Jun. de 2021
Editada: Kazi Alam el 10 de Jun. de 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 comentario
Adam Danz
Adam Danz el 10 de Jun. de 2021
Editada: Adam Danz el 10 de Jun. de 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.

Iniciar sesión para comentar.

Más respuestas (1)

dpb
dpb el 10 de Jun. de 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 comentarios
Kazi Alam
Kazi Alam el 10 de Jun. de 2021
Thanks! I have found a better option. I will post it below.

Iniciar sesión para comentar.

Categorías

Más información sobre Logical en Help Center y File Exchange.

Etiquetas

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by