Matlab:使用较小的数组

时间:2015-08-19 15:42:46

标签: arrays matlab matrix

我有两个巨大的阵列,看起来像:

A = [11, 11, 12, 3, 3, 4, 4, 4 ];
B = [ 12, 4; 3, 11; 11, 1; 4, 13 ];

我想创建一个数组,它从A中获取B和第1列的值,如下所示:

C = [ 11, 1; 11, 1; 12, 4; 3, 11; 3, 11; 4, 13; 4, 13; 4, 13 ];

我不想使用或任何其他类型的循环来优化过程。

对不起是简洁的。

我将搜索B列1中A的第1列中的每个元素,并从B中选择相应的第2列元素,并创建一个新的数组,其中第1列元素为A,并且发现了B中的第2列元素。

2 个答案:

答案 0 :(得分:3)

感谢@rayryeng向我澄清了这个问题

  • 假设A中的每个元素都出现在B的第1列中:

    [~, ind] = max(bsxfun(@eq, A(:).', B(:,1)), [], 1);
    C = B(ind,:);
    
  • 如果这个假设不一定成立:

    [val, ind] = max(bsxfun(@eq, A(:).', B(:,1)), [], 1);
    C = B(ind(val),:);
    

    所以例如A = [11, 20, 12, 3, 3, 4, 4, 4 ];会产生

    C =
        11     1
        12     4
         3    11
         3    11
         4    13
         4    13
         4    13
    

答案 1 :(得分:3)

您在此问题中正在使用A并搜索B的第一列以查看是否匹配。匹配后,在B中提取与此匹配位置对应的行。对A中的其余值重复此操作。

假设A中的B的所有值都可以在B中找到并且unique的第一列不同并且没有重复项,那么您可以sortrows来电和unique来电。 A调用位于A,因此您可以将B中的每个值分配为按排序顺序排列的唯一标签。然后,您可以使用这些标签索引到[~,~,id] = unique(A); Bs = sortrows(B); C = Bs(id,:); 的排序版本以获得所需的结果:

C

我们选择C = 11 1 11 1 12 4 3 11 3 11 4 13 4 13 4 13

create_table "users", force: true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.string   "password_digest"
    t.string   "user_name"
    t.date     "birthdate"
    t.integer  "zip_code"
    t.string   "gender"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "avatar_file_name"
    t.string   "avatar_content_type"
    t.integer  "avatar_file_size"
    t.datetime "avatar_updated_at"
    t.integer  "user_id"
    t.integer  "profile_id"
    t.string   "background_file_name"
    t.string   "background_content_type"
    t.integer  "background_file_size"
    t.datetime "background_updated_at"
    t.string   "slug"
  end