比方说,我有一堆带有标签[0-9]的数据。我想基于这些数据的所有成对交互来收集信息。为了避免冗余,我这样做:
a = zeros(45, 1);
pair = 1;
for i = 1:9
for j = (i+1):10
a(pair) = i * j;
pair = pair + 1;
end
end
如果我想检查a
中的所有内容,则可以使用pair
,i
,j
结构以二维方式遍历它。没关系。但是,如果我只想以编程方式检查某些对,该怎么办?是否有某种逻辑可以使我执行类似于a(i,j)
的操作,其中a(i,j)实际上是“来自在数据类i
和j
上训练的模型的系数“?
运行Matlab_R2018b。出于好奇,我正在将其作为DAGSVM实现的一部分。
答案 0 :(得分:0)
您可以将输入信息与结果矢量一起存储。
a = zeros(45, 1);
pair = 1;
I = a;
J = a;
for i = 1:9
for j = (i+1):10
I(pair) = i;
J(pair) =j;
a(pair) = i * j;
pair = pair + 1;
end
end
res=[a,I,J];
然后使用函数使用浮点值的容差将输入值匹配到给定对。
function Val = findVal(res,pair)
#pair = [i,j]
pairs = res(:,2:3);
ind = sum(abs(pairs-pair)<1e-6,2)==2;
if sum(ind) == 0
disp('No match found')
Val = NaN
else
Val = res(ind,1);
disp('pair')
disp(pair)
disp('value')
disp(Val)
end
endfunction
现在我生成两对,一组在集合中,另一对不显示函数的用法。
testpair = res(8,2:3)
badpair = [20,20]
findVal(res,testpair)
findVal(res,badpair)
答案 1 :(得分:0)
您不需要为此的循环。
如果i
的范围为[1:I]
,而j
的范围为[1:J]
,则您有K = I*J
可能的相互作用,其中一半是冗余/置换{{1} }。
(A(i,j) = A(j,i))
要仅访问某些组合,您可以使用此基本线性索引。
j = mod(pair, J); % "row"
i = floor((pair-1) / J) + 1; % "col"
pair = j + i * J; % linear index
;
听起来您想避免自我互动和冗余,所以只能选择a(pair) = a(j,i) = a(i,j) = i * j
x或i > j
的对,这等效于只创建上三角或下三角(如您的上面的代码)矩阵。