Как я могу сжать одноэлементное измерение после получения SubArray?

У меня есть двумерный массив 'v', представляющий список векторов, и у меня есть трехмерный массив 'a', который представляет список матриц

ILArray v = counter(2, 3);
ILArray a = counter(2, 3, 3);

Теперь я хочу взять подмассив обоих и сделать умножение матрицы:

ILArray av = multiply(a[1,full,full], v[1,full]);

Он будет жаловаться, что размеры не совпадают, и это потому, что размеры a[1,full,full] является (1,3,3) и из v[1,full] является (1,3), Другими словами, подмассивы содержат одноэлементное измерение. В Matlab я могу удалить эти размеры синглтона с помощью squeeze(). Но как я могу сделать это в ILNumerics?


Я только что обнаружил, что если одноэлементные измерения замыкаются, то они автоматически удаляются ILNumerics, так что это работает:

ILArray v = counter(3, 2);
ILArray a = counter(3, 3, 2);
ILArray av = multiply(a[full,full, 1], v[full, 1]);

Также, a[full,full,1] имеет размерность (3,3) и не (3,3,1),

Означает ли это, что ILNumerics не поддерживает одноэлементные измерения без запаздывания? Другими словами, не поддерживает ли пошаговые массивы в вычислениях, а только смежные? Это было бы довольно ограничительным по меньшей мере.

Спасибо Люк

1 ответ

Разве простое изменение формы не должно сработать?

ILArray<int> I = ILMath.counter<int>(1,1,ILMath.size(5,4,3));

I
<Int32> [5,4,3]
    [0]: (:,:,0)
    [1]:          1          6         11         16
    [2]:          2          7         12         17
    [3]:          3          8         13         18
    [4]:          4          9         14         19
    [5]:          5         10         15         20
    [6]: (:,:,1)
    [7]:         21         26         31         36
    [8]:         22         27         32         37
    [9]:         23         28         33         38
    [10]:         24         29         34         39
    [11]:         25         30         35         40
    [12]: (:,:,2)
    [13]:         41         46         51         56
    [14]:         42         47         52         57
    [15]:         43         48         53         58
    [16]:         44         49         54         59
    [17]:         45         50         55         60

I["0;:;:"]
<Int32> [1,4,3]
    [0]: (:,:,0)
    [1]:          1          6         11         16
    [2]: (:,:,1)
    [3]:         21         26         31         36
    [4]: (:,:,2)
    [5]:         41         46         51         56

ILMath.reshape(I["0;:;:"],4,3)
<Int32> [4,3]
    [0]:          1         21         41
    [1]:          6         26         46
    [2]:         11         31         51
    [3]:         16         36         56

Иметь squeeze Функция была бы более удобной. Вы можете открыть запрос на функцию отслеживания ошибок, чтобы он был реализован в одном из следующих выпусков: http://ilnumerics.net/mantis

Другие вопросы по тегам