从Matrix配置整数值

时间:2016-07-17 22:35:51

标签: matlab

我写了一个循环通过几个@Override public void open(Collection<TopicPartition> partitions) { HashMap<TopicPartition, Long> offsetMapNew = new HashMap<>(); for (TopicPartition tp : partitions) // for each partition assigned { Long offset = myOffsetMap.get(tp.topic() + "-" + tp.partition()); if (offset == null) { offset = 0l; } // 0 Long offsetMapNew.put(tp, offset); } mySavedTaskContext.offset(offsetMapNew); // sync offsets ? } 的脚本。 我得到的输出看起来像这样:

matrices

依旧......

我想要做的是计算存在多少个唯一的配置文件,如果一个矩阵包含10,40,50 20,60,50,80 30,50,70,110 30,70,110 ,它将被计为标记为(10,40,50)的一个配置文件,如果它将找到另一个矩阵,它应该打印完全相同(10,40,50):10,40,50找到2次,依此类推。

总而言之,我有一个运行矩阵的脚本。它们包含不同的值,不时重复,我想要计算所有存在的唯一配置文件。我们输入这个:

10,40,50

输出应该是(然而可以输出计数):

10,40,50
10,40,50
10,40,50
30,50,70,110
20,60,50,80
30,50,70,110
10,40,50
10,40,50

非常非常感谢帮助,这是为了一个爱好项目。

编辑:这不是我正在使用的单元格数组,它是&lt; 1x500&gt;矢量我正在循环低谷。

3 个答案:

答案 0 :(得分:1)

(遗憾的是unique函数不能处理数字向量的单元格数组。)

您可以按照以下方式执行此操作:

x = { [10,40,50];
      [10,40,50]
      [10,40,50];
      [30,50,70,110];
      [20,60,50,80];
      [30,50,70,110];
      [10,40,50];
      [10,40,50] };
[ii, jj] = ndgrid(1:numel(x)); % indices of all pairs
m = cellfun(@isequal, x(ii), x(jj)); % all pairwise comparisons
[u, v] = unique(m, 'rows', 'stable'); % unique rows, and their indices
count = sum(u,2); % result: number of repetitions
unique_x = x(v); % result: unique vectors

这给出了

>> celldisp(unique_x)
unique_x{1} =
    10    40    50
unique_x{2} =
    30    50    70   110
unique_x{3} =
    20    60    50    80
>> count
count =
     5
     2
     1

以所需格式显示:

for n = 1:numel(unique_x)
    disp([mat2str(unique_x{n}) ' found ' num2str(count(n)) ' time(s)'])
end

打印

[10 40 50] found 5 time(s)
[30 50 70 110] found 2 time(s)
[20 60 50 80] found 1 time(s)

如果结果是在循环中获得的:将它们收集到一个单元格数组中然后应用上面的内容:

x = cell(1,num_iter); % preallocate if possible
for iter_index = 1:num_iter
    % Do stuff that gives a vector iter_result as a result
    x{iter_index} = iter_result;
end
% Now apply above code to x

答案 1 :(得分:0)

我猜你的脚本输出是一个单元格数组,因为我的特殊答案是基于这个假设。因此,如果脚本的输出是:

output = {[10,40,50];
          [10,40,50];
          [10,40,50];
          [30,50,70,110];
          [20,60,50,80];
          [30,50,70,110];
          [10,40,50];
          [10,40,50]};

我们可以以字符串格式转换您的输出。 Lame,但工作:):

tmp = cellfun(@num2str,output,'UniformOutput',false);

然后我们使用unique函数:

[a,b,c]=unique(tmp);

atmp的唯一字符串,b是tmp中第一次出现字符串,c显示tmp中的哪个元素对应a中的哪个元素,即将tmp映射到a。我们现在要做的就是计算向量12 - s,3 - s,c - s等的数量。我更喜欢为此目的使用一个简单的循环:

for k = 1:length(b)
    n(k) = nnz(c == k);
    disp(['[',a{k},'] found ',num2str(n(k)),' time(s)'])
end

所以,最终的输出是:

[10  40  50] found 5 time(s)
[20  60  50  80] found 1 time(s)
[30   50   70  110] found 2 time(s)

希望有所帮助

答案 2 :(得分:0)

output = {[10,40,50];
      [10,40,50];
      [10,40,50];
      [30,50,70,110];
      [20,60,50,80];
      [30,50,70,110];
      [10,40,50];
      [10,40,50]};
tmp = cellfun(@num2str,output,'UniformOutput',false); % number to string
[a,~,c] = unique(tmp); % find unique profiles and index from tmp to a
count = accumarray(c,1); % count same index in c

然后

for k = 1 : length(a)
    fprintf('[ %s ] found %d time(s)\n',a{k},count(k));
end

显示与其他答案相同的消息。