Чтение одномерного массива Matlab, построенного на парных взаимодействиях - PullRequest
1 голос
/ 10 апреля 2019

Допустим, у меня есть куча данных с метками [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 .

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Вы можете хранить входную информацию вдоль полученного вектора.

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)
0 голосов
/ 10 апреля 2019

Вам не нужны петли для этого. Если i охватывает диапазон [1:I], а j охватывает диапазон [1:J], то у вас есть K = I*J возможных взаимодействий, половина из которых избыточна / перестановки (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;

Звучит так, как будто вы хотите избежать самовзаимодействия и избыточности, поэтому выбирайте только пары, в которых либо i > j xor j > i, что эквивалентно простому созданию матрицы верхнего или нижнего треугольника (как в коде выше) ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...