Как найти размеры в логической симметричной матрице ilnumerics?

У меня есть такая логическая симметричная матрица ilnumerics

0   0   0   0   0   0   1   1   1   1
0   0   0   0   0   1   0   1   1   1
0   0   0   0   0   1   1   0   1   1
0   0   0   0   0   1   1   0   0   1
0   0   0   0   0   1   1   1   1   0
0   1   1   1   1   0   0   0   0   0
1   0   1   1   1   0   0   0   0   0
1   1   0   0   1   0   0   0   0   0
1   1   1   0   1   0   0   0   0   0
1   1   1   1   0   0   0   0   0   0 

Я хочу получить все размеры (строка и столбец), где значение == 1

результат = (0,6), (0,7), (0,8), (0,9) (1,5), (1,7), (1,8), (1,9) (2 , 5), (2,6), (2,8), (1,9) (3,5), (3,6), (3,9) (4,5), (4,6), (4,7), (4,8)

Есть ли более быстрый способ сделать это с помощью библиотеки ilnumerics в C #?

РЕДАКТИРОВАТЬ: вот мое решение

    ILNumerics.ILLogical matrixThreshold;
    ..... Some C# code
    for (int i = 0; i < matrixThreshold.Length; i++)
        for (int j = i + 1; j < matrixThreshold.Length; j++)
            if (matrixThreshold.GetValue(i, j) == 1) Console.Write("({0},{1}){2}", i, j, Environment.NewLine);

person LeMoussel    schedule 01.10.2013    source источник
comment
Будьте осторожны с ILArray ‹T› .Length! Он дает САМЫЙ БОЛЬШОЙ размер - в этом случае это не то, что вам нужно. Вам лучше использовать matrixThreshold.S [0] для длины столбца и .S [1] для длины строки.   -  person user492238    schedule 01.10.2013


Ответы (2)


ILLogical L = ILMath.rand(10, 12) > 0.5;

>L
Logical [10,12]
    [0]:   0   0   0   1   1   1   0   0   0   0   1   1 
    [1]:   0   1   1   1   0   1   1   1   1   0   1   0 
    [2]:   0   1   1   1   1   1   0   1   1   0   1   1 
    [3]:   0   0   0   0   0   1   0   0   0   0   1   0 
    [4]:   0   0   0   0   0   0   1   0   1   1   0   0 
    [5]:   0   0   1   0   0   1   0   0   1   1   1   1 
    [6]:   1   0   1   0   1   1   0   1   0   1   0   1 
    [7]:   1   1   1   0   1   1   0   1   1   1   0   1 
    [8]:   1   0   0   1   1   1   0   0   1   0   0   0 
    [9]:   1   1   1   1   0   0   0   0   1   1   0   0 

Запишите индексы столбца / строки в виде пар:

ILArray<int> C = 1;
ILArray<int> R = ILMath.find(L, 0, C); 
// C now holds the column indices, R the row indices
for (int i = 0; i < C.Length; i++) {
    System.Diagnostics.Debug.WriteLine("({0},{1})", R.GetValue(i), C.GetValue(i)); 
}

Который дает:

(6,0)
(7,0)
(8,0)
(9,0)
(1,1)
(2,1)
(7,1)
(9,1)
(1,2)
(2,2)
(5,2)
(6,2)
(7,2)
(9,2)
(0,3)
(1,3)
(2,3)
(8,3)
(9,3)
(0,4)
(2,4)
(6,4)
(7,4)
(8,4)
(0,5)
(1,5)
(2,5)
(3,5)
(5,5)
(6,5)
(7,5)
(8,5)
(1,6)
(4,6)
(1,7)
(2,7)
(6,7)
(7,7)
(1,8)
(2,8)
(4,8)
(5,8)
(7,8)
(8,8)
(9,8)
(4,9)
(5,9)
(6,9)
(7,9)
(9,9)
(0,10)
(1,10)
(2,10)
(3,10)
(5,10)
(0,11)
(2,11)
(5,11)
(6,11)
(7,11)
person user492238    schedule 01.10.2013
comment
Вы можете просто вызвать find () с 3 аргументами. Это упростило бы код. - person Haymo Kutschbach; 01.10.2013
comment
Большое тебе спасибо. Дополнительный вопрос: Я хочу суммировать по столбцам, это более быстрый способ? ILNumerics.ILRetArray<byte> sumCol = ILNumerics.ILMath.sum(L); - person LeMoussel; 01.10.2013
comment
Абсолютно. Но я бы предложил явно указать размер для суммирования. Это обеспечивает большую надежность для случая, когда L - вектор-строка. - person Haymo Kutschbach; 02.10.2013
comment
О, и используйте ILArray ‹byte› вместо ILRetArray ‹byte› в качестве типа переменной !! - person Haymo Kutschbach; 02.10.2013

person    schedule
comment
Не могли бы вы повторно ввести свой код так, чтобы он скомпилировался? - person rhughes; 01.10.2013
comment
Не существует встроенной функции ilnumerics? Например, функция dist () на языке R. - person LeMoussel; 01.10.2013