Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 阵列和单元阵列的传感器时间分布_Matlab_Cell Array - Fatal编程技术网

Matlab 阵列和单元阵列的传感器时间分布

Matlab 阵列和单元阵列的传感器时间分布,matlab,cell-array,Matlab,Cell Array,我在matlab中有一个单元格数组和一个数值数组,它们是内在联系的。数字数组(A)包含来自多个数据源的一系列时间,例如每次测量的时间。该阵列由n个传感器(列)和n个测量值(行)组成。由于0是有效时间,因此默认情况下数组填充为-1 A = [ [ 100 110 -1 -1 ] ; ... [ -1 200 180 -1 ] ; ... [ -1 200 210 240 ] ; ... [ 400 -1 -1 450 ] ]; 该单元格按时间顺序

我在matlab中有一个单元格数组和一个数值数组,它们是内在联系的。数字数组(A)包含来自多个数据源的一系列时间,例如每次测量的时间。该阵列由n个传感器(列)和n个测量值(行)组成。由于0是有效时间,因此默认情况下数组填充为-1

A = [ [ 100 110  -1  -1 ] ; ...
      [  -1 200 180  -1 ] ; ...
      [  -1 200 210 240 ] ; ...
      [ 400  -1  -1 450 ] ];
该单元格按时间顺序包含数字数组每行的传感器。每个单元元素包含一个向量,该向量按照传感器进行测量的顺序显示传感器

C = { [1 2] [3 2] [2 3 4] [1 4]};
我想查看相对于每个传感器的时间分布,例如传感器2/3/4(存在时)相对于传感器的时间分布是什么

例如

传感器1参与第一次和第四次测量,其他探测器分别为+10(100->110)和+50(400->450)。在本例中,我希望返回一个数组,如[10 50]

传感器2涉及前三个事件,其中一个是三向事件。在这种情况下,sensor2并不总是第一个触发,因此某些值将为负值。在本例中,我希望返回[-10-20+10+40]

使用相同的逻辑传感器3应返回[20-10 30]和传感器4[-40-30-50]

我相信应该有一个简单的方法来做到这一点,但我不能让我的头围绕它。当然,我举的例子很简单。。。。通常情况下,我要处理数十个传感器和100000个测量值,因此在每个列/行上循环将花费很长时间。。。如果每次测量中只有两个(大约两个)传感器触发,结果往往很小。出于这个原因,我希望使用单元格数组中的元素只访问数值数组中正确的元素


有什么想法吗?

如果我对问题理解得足够好,可以解决问题,那么您似乎不需要为输出担心
C
。这是密码-

num_sensors = size(A,2)%// No. of sensors

A = A'; %//' The tracking goes row-wise, so transpose the input array
A(A==-1)=nan; %//set minus 1's to NaNs as excluding elements
out = cell(num_sensors,1);  %// storage for ouput
for k1 = 1:num_sensors

    %// Per sensor subtractions
    per_sensor_subt = bsxfun(@minus,A,A(k1,:)); 

    %// Set all elements of its own row to NaNs to exclude own subtractions
    per_sensor_subt(k1,:)=nan; 

    %// Get all the non-nans that correspond to the valid output
    out{k1} = per_sensor_subt(~isnan(per_sensor_subt));
end
输出-

>> celldisp(out)
out{1} =
    10
    50
out{2} =
   -10
   -20
    10
    40
out{3} =
    20
   -10
    30
out{4} =
   -40
   -30
   -50

正如您已经确认的那样,每个单元格的输出顺序并不重要,您可以采用一种简化的方法,该方法可以更快-

num_sensors = size(A,2)%// No. of sensors
A(A==-1)=nan; %//set minus 1's to NaNs as excluding elements
out = cell(num_sensors,1);  %// storage for ouput
for k1 = 1:num_sensors

    %// Per sensor subtractions
    per_sensor_subt = bsxfun(@minus,A,A(:,k1)); 

    %// Set all elements of its own row to NaNs to exclude own subtractions
    per_sensor_subt(:,k1)=nan; 

    %// Get all the non-nans that correspond to the valid output
    out{k1} = per_sensor_subt(~isnan(per_sensor_subt));
end

完全矢量化的解决方案(如果内存允许)-

[m,n] = size(A)%// No. of sensors and measurements
A(A==-1)=nan; %//set minus 1's to NaNs as excluding elements

%// Per sensor subtractions
per_sensor_subt = bsxfun(@minus,A,permute(A,[1 3 2]))

%// Set all elements of its own row to NaNs to exclude own subtractions
own_idx = bsxfun(@plus,bsxfun(@plus,[1:m]',[0:n-1]*numel(A)),[0:n-1]*m);%//'
per_sensor_subt(own_idx)=nan;

%// Linear and row-col-dim3 indices of valid subtractions
idx = find(~isnan(per_sensor_subt))
[x,y,z] = ind2sub(size(per_sensor_subt),idx)

%// Get per sensor output
out = arrayfun(@(n) per_sensor_subt(idx(z==n)),1:n,'un',0)

如果要计算
C
,请使用此方法-

%// Sort A row-wise
[sortedA,sorted_idx] = sort(A,2)

%// Set all invalid indices to zeros, so that later on we can use `nonzeros`
%// to extract out the valid indices
valid_sorted_idx = sorted_idx.*(sortedA~=-1)

%// Convert to a cell array
valid_sorted_idx_cell = mat2cell(valid_sorted_idx,ones(1,size(A,1)),size(A,2))

%// Extract the valid ones(nonzero indices) for the final output, C
C = cellfun(@(x) nonzeros(x), valid_sorted_idx_cell,'un',0)

因此,在
A
的第二行中,您有
[-1200180-1]
。其中,
200
对应于第二个传感器还是第三个传感器?询问,因为
C
的第二个单元格是[3 2]。@Divakar:这是第二个传感器(因为它在第二列)@Divakar,
C
中的顺序表示到达顺序。在[32]=>第三个传感器触发(@180),然后传感器2(@200)@Hoki-就是这样,你得到了它。顺序为[3 2],因为传感器3在传感器2@200之前的180、20触发。还想知道每个传感器的输出顺序是否重要?比如,如果我对传感器4说
[-50-40-30]
而不是
[-40-30-50]
,那可以吗?+1。你赢了我。我刚刚完成了一个非常类似的解决方案(虽然没有转置,但为什么不。为什么需要?@Hoki,因为当时的顺序会有所不同。问了一个问题作为对此的评论。它为传感器4提供了
[-50-40-30]
。感谢+1!:)伟大的解决方案!因此,基本上,out单元的每个元素中包含的数组是一个特定传感器相关时间的列表?而且,就我所见,上述两种解决方案对于所有情况都是相同的,除了传输和排除自身行时与k1的行/列交换?就时间而言,我将两者都放入10000个迭代循环中,然后它们就可以出来了same@Mark这是正确的。但对于每个传感器,第二种方法中的减法顺序为列式,矢量化解决方案与问题中采用的行式相反。要了解我的意思,请运行第二种方法,并查看out{4}即传感器4输出的
celldisp(out)