я хочу создать новую матрицу
Из этого мне кажется, что вы хотите новый T[,]
объект.
, который будетстарая матрица, но без первой строки и первого столбца
Я понимаю, что вы хотите, чтобы новый T[,]
объект содержал те же значения , что и исходный, за исключениемпервая строка / столбец.
есть ли способ сделать это без использования циклов?
Если я правильно истолковал ваш вопрос, то нет, не совсем.Вам нужно будет скопировать элементы из одного массива в другой;это требует перечисления.Но это не значит, что вы не можете абстрагировать реализацию этого метода в метод многократного использования (на самом деле это то, что вы должны делать).
public static T[,] SubMatrix(this T[,] matrix, int xstart, int ystart)
{
int width = matrix.GetLength(0);
int height = matrix.GetLength(1);
if (xstart < 0 || xstart >= width)
{
throw new ArgumentOutOfRangeException("xstart");
}
else if (ystart < 0 || ystart >= height)
{
throw new ArgumentOutOfRangeException("ystart");
}
T[,] submatrix = new T[width - xstart, height - ystart];
for (int i = xstart; i < width; ++i)
{
for (int j = ystart; j < height; ++j)
{
submatrix[i - xstart, j - ystart] = matrix[i, j];
}
}
return submatrix;
}
Приведенный выше кодэто не красиво, но как только оно будет на месте, вы сможете использовать его довольно аккуратно:
T[,] withoutFirstRowAndColumn = originalMatrix.SubMatrix(1, 1);
Теперь, если я неверно истолковал ваш вопрос, и вы не умерли ...настроив на создание нового объекта T[,]
, вы можете повысить эффективность этого подхода, вообще не выделяя новый T[,]
;Вы можете взять идею Абеля (вместе с ее предостережениями) и использовать код unsafe
, чтобы по существу моделировать a T[,]
с индексами, указывающими на элементы исходной матрицы.Если подумать, вы могли бы даже достичь этого, не прибегая к коду unsafe
;вам просто нужно определить интерфейс для функциональности, которую вы хотели бы предоставить (свойство this[int, int]
приходит на ум), а затем реализовать эту функциональность (в этом случае тип возвращаемого значения не будет T[,]
, ноя понимаю, что это может быть что-то вроде это).