@SergeySerge11

Можно ли преобразовать без копирования byte[,] в byte[]? Как избавится от пробелммы, что одной мат. библиотеке нужен [,], другой[] с width height?

Есть библиотека ILGPU там есть метод который возвращает или ему нужен массив xy[,]? да и вообще кучу раз с таким сталкивался, что где-то как Bitmap нужен одномерный массив с доп инфой, где-то двумерный, а где-то классический [][], при этом с тем же смыслом что равен одномерному.
int[,] image=...;
   buffer2D .CopyFromCPU(image ); //  возвращает  массив [,]
   
   int[] _image= cast(image); // обычный метод копирования, 
 // самое ужасное что его уже раз 10 реализовывал, так как даже самая простая реализация
 // быстрее встроенного метода Cast().ToArray в разы.  который через итераторы,
 // да еще и 3 раза 1 байт копирует с места на место, 1+1+ Σ(1/2^x)=3 раза. Что за траву курил разработчик там.   
  Bitmap bitmap=BitmapFromBytes(_image,w,h);

 public static Bitmap BitmapFromBytes(int[] data, int width, int height)
 { 
 }


Для чего вообще нужны двумерные массивы, они всегда в любых библиотеках только головную боль вызывают? Если всегда намного проще и быстрее самому их реализовывать, и не надо по 100 раз из одного в другой копировать, если начал так, потом другой библиотеке нужен одномерный массив, другой двумерный.

При этом N-мерный массив точно такой же как обычный, только где-то не помню на 12 байт размер объекта отличается. Существует ли способ, взять и в наглую грязно заменить объект,
вот в кучи допустим где int[,] находится, и как-то в кучи прям задать что вот с этого места начинается теперь int[], как-то пытался, но там типа сборка мусора сломятся может и ссылки ломаются на объекты. Может есть какой-то способ.
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 2
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Как вариант, использовать легковесный срез массива без копирования (Span<T>):
byte[,] data2D = ...; 
int width = data2D.GetLength(1);

// Создаем Span byte из data2D.
Span<byte> data1D = MemoryMarshal.CreateSpan(ref data2D[0, 0], data2D.Length); 

// Передаем Span byte в функцию.
ProcessData(data1D, width);
Ответ написан
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Просто так их сконвертировать нельзя. Реализацию не знаю, но внутри массивы разных размерностей различаются между собой по структуре. На моем ПК это дает 2 2 0 0:
var array2 = new int[,]
{
    { 1, 2 },
    { 3, 4 }
};
var array = Unsafe.As<int[]>(array2);
foreach (var i in array)
{
    Console.WriteLine(i);
}

Единственный вариант в данном случае - вручную создавать и копировать. Разве что можно сделать это оптимальнее.
var array2 = new int[,]
{
    { 1, 2 },
    { 3, 4 }
};
var arrayDst = new int[array2.GetLength(0) * array2.GetLength(1)];
Buffer.BlockCopy(array2, 0, arrayDst, 0, 4 * sizeof(int));


P.S. тут надо заметить, что Buffer.BlockCopy принимает количество байтов, а не элементов + копировать может только примитивные типы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы