我有两个巨大的阵列,看起来像:
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列元素。
答案 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