2015-07-28 3 views
-11

Напишите функцию, называемую identity, которая создает квадратную единичную матрицу, которая является матрицей, элементы которой равны 0, за исключением элементов на диагонали (слева направо и справа), которые имеют значение 1. Диагональ состоит из тех элементов, индексы строк и столбцов которых одинаковы: (1,1), (2,2) и т. Д.Создание квадратной идентичной матрицы

Функция принимает один положительный целочисленный входной аргумент, который является размером матрицы, и возвращает матрицу как выходной аргумент.

Например, identity(4) должен возвращать идентификационную матрицу 4 на 4.

Вам не разрешено использовать встроенные функции eye или diag.

(Подсказка: вы можете индексировать в матрицу с одним индексом и MATLAB будет обрабатывать его, как если бы это был вектор, использующий столбцам заказ.)

+6

Это легко достичь и звучит как домашнее задание. Где ваши исследования? Пожалуйста, прочитайте [как спросить] (http://stackoverflow.com/help/how-to-ask) и отредактируйте свой вопрос после. Покажите, что вы пробовали, и что ваши мысли должны решить эту проблему. – Matt

+0

Или вы можете сделать так: fix (corrcoef (rand (10,10))) :) Это не очень хороший способ, но он будет делать то, что вам нужно. – patrik

ответ

0

Предполагая, что вы можете использовать встроенную функцию zeros() , возможная реализация eye() Funtion заключается в следующем:

function matrix = identity(n) 
    out = zeros(n); 
    idx = 1:n+1:n^2; 
    out(idx) = 1; 
    matrix = out; 
end 
2

Давайте сделаем это в два простых линий и без zeros ... Первая строка создает n x n матрицу, где все элементы 0. После того, как вы сможете (как подскажет ваш намек), обратиться к элементам с помощью одного аргумента. Расстояние между единицами в единичной матрице равно n+1. Таким образом, вы пишете те, которые указаны на указанном расстоянии до конца.

function out = identity(n) 
    out(n,n)  = 0; 
    out(1:n+1:end) = 1; 
end 
+0

Знаете ли вы, если есть разница в производительности между «A (n, n) = 0' и« A = нули (n) »? – k1next

+0

О, вау, я просто проверил это, и для 'N = 10000' ваш подход занимает 0.000255 секунд, а' zeros (N) 'принимает 1.106566 секунд. Я всегда думал, что стандартный способ - использовать «нули (N)». – k1next

+0

@sonystarmap Отметьте [this] (http://undocumentedmatlab.com/blog/preallocation-performance) статью о недокументированном Matlab. Не пропустите раздел «Варианты предварительного выделения». – Matt

1

Вы могли бы начать с основ:

function M = identity(n) 
    M = zeros(n); 
    for i=1:n 
     M(i,i) = 1; 
    end 
end 

Практически тот же код, как и любой другой язык ...

Смежные вопросы