索引单元格数组matlab中的double

时间:2014-05-28 14:16:12

标签: matlab indexing double cell cell-array

我有一个名为Event的179X59条目的单元格数组,每个元素都是< 1X14>双重

所以例如Event{1,1}是一个14位的二进制数...就像0 1 0 0 0 0 0 0 0 0 1 0 0 0一样,它通过第1到第14列展开,所以每列都有一个位。

现在我的任务是索引单元格数组的每个元素并进入double并指定一个特定的字母表,如果我看到1,则为第一位指定a。

因此,如果我的字母表是二进制1 1 1 1 1 1 1 1 1 1 1 1 1 1的A到N,则需要获取

A B C D E F G H I J K L M N而不是那个二进制数。

因此,对于第二行0 1 0 0 0 0 0 0 0 0 1 0 0 0中的示例,我需要得到

0 B 0 0 0 0 0 0 0 0 K 0 0 0

最后应该返回B,K删除零。

我尝试将每个元素分配到矩阵并尝试使用strrep,但它没有帮助我。

3 个答案:

答案 0 :(得分:1)

不删除零:

alphabet = [11:24]; %// numbers. Replace values as needed
resultzeros = bsxfun(@times, alphabet, vertcat(Event{:}));
resultzeros = reshape(mat2cell(resultzeros, ones(1, size(resultzeros,1))), size(Event));

如果您需要删除零:

result = cellfun(@(x) nonzeros(x).', resultzeros, 'uni', 0);

或直接:

result = cellfun(@(x) alphabet(x~=0), Event, 'uni', 0);

示例:

>> Event = {[0 0 1 0], [1 1 1 1]; [1 1 0 0], [0 0 1 1]};
>> alphabet = [4 5 6 7];

给出

result{1,1} =

     6

result{2,1} =

     4     5

result{1,2} =

     4     5     6     7

result{2,2} =

     6     7

答案 1 :(得分:0)

我认为时间并不重要,所以你至少可以循环。粗略草图:

alphabet = {A, B, C, D, E...}

j= 0;
for i=1:nBit
  if( Event{1,1}(i) == 1)
    EventAlphabet{1,1}{j} = alpabet{i};
    j = j + 1;
  end
end

你的问题有点不清楚,所以我的答案是粗略的草图,可能会帮助你。

答案 2 :(得分:0)

<强>代码

cellfun(@(x) cellstr(char(nonzeros(x.*[65:65+numel(x)-1])))', Event,'uni',0)

<强>结果

样本Event

Event = {
    [0 1 0 1 0 0 1] [0 1 0 1 0];
    [0 1  1 1 0] [0 0 0 1 1 1 0 0 0 0 1 1 0 1]}

输出 -

>> Event{:}
ans =
     0     1     0     1     0     0     1
ans =
     0     1     1     1     0
ans =
     0     1     0     1     0
ans =
     0     0     0     1     1     1
>> out{:}
ans = 
    'B'    'D'    'G'
ans = 
    'B'    'C'    'D'
ans = 
    'B'    'D'
ans = 
    'D'    'E'    'F'

当然,Event位于“上层”的列数和行数保持在out -

>> Event
Event = 
    [1x7 double]    [1x5  double]
    [1x5 double]    [1x14 double]
>> out
out = 
    {1x3 cell}    {1x2 cell}
    {1x3 cell}    {1x6 cell}