2010-02-19 10 views
3

J'ai un grand tableau 15x15x2200. Il s'agit simplement d'une collection de 15x15 matrices éparses représentant les liens entre 15 nœuds et leur variation sur 2200 unités de temps. J'ai besoin de calculer combien de temps chaque lien persiste. Par ce que je veux dire, supposons A [4,11] est 0 jusqu'à l'unité de temps 5 et reste 1 jusqu'à l'unité de temps 20, puis devient 0 et redevient 1 de 42 à 46, je voudrais avoir un tableau de cette information dans un tableau qui stocke ces longueurs séparément comme LEN = {... 15, 4, ....}calculer algorithme de persistance d'élément de tableau

J'essaye de faire ceci dans matlab et puis de générer un histogramme. Quelle est la meilleure façon de procéder?

Répondre

4

Essayons de le faire sans boucles.

%# random adjacency matrix 
array = randi([0 1], [15 15 2200]); 

%# get the size of the array 
[n1,n2,n3] = size(array); 

%# reshape it so that it becomes n3 by n1*n2 
array2d = reshape(array,[],n3)'; 

%# make sure that every run has a beginning and an end by padding 0's 
array2d = [zeros(1,n1*n2);array2d;zeros(1,n1*n2)]; 

%# take the difference. +1 indicates a start, -1 indicates an end 
arrayDiff = diff(array2d,1,1); 
[startIdx,startCol] = find(arrayDiff==1); 
[endIdx,endCol] = find(arrayDiff==-1); 

%# since every sequence has a start and an end, and since find searches down the columns 
%# every start is matched with the corresponding end. Simply take the difference 
persistence = endIdx-startIdx; %# you may have to add 1, if 42 to 46 is 5, not 4 

%# plot a histogram - make sure you play with the number of bins a bit 
nBins = 20; 
figure,hist(persistence,nBins) 

Edit:

Pour voir une autre représentation visuelle de la persistance de vos pistes, appelez

figure,imshow(array2d) 

Cela montre des bandes blanches partout où vous avez une séquence de liens, et il sera vous montrer les modèles généraux.

+0

@Jonas: J'ai formaté le code un peu pour le rendre plus facile à lire :) – Amro

+0

@Amro: désolé, je dois avoir soumis ma modification pendant que vous éditiez. Pourriez-vous essayer de nouveau, s'il vous plaît? – Jonas

+0

oups .. ok essayons encore! – Amro

Questions connexes