读取基于成对交互的一维Matlab数组

时间:2019-04-10 15:51:39

标签: matlab

比方说,我有一堆带有标签[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中的所有内容,则可以使用pairij结构以二维方式遍历它。没关系。但是,如果我只想以编程方式检查某些对,该怎么办?是否有某种逻辑可以使我执行类似于a(i,j)的操作,其中a(i,j)实际上是“来自在数据类ij上训练的模型的系数“?

运行Matlab_R2018b。出于好奇,我正在将其作为DAGSVM实现的一部分。

2 个答案:

答案 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的对,这等效于只创建上三角或下三角(如您的上面的代码)矩阵。