Объем переменной - это контекст, в котором он определен. По большей части все переменные PHP имеют только одну область. В эту единую область охвата включены и требуемые файлы. Например:
<?php
$a = 1;
include 'b.inc';
?>
Здесь переменная $a
будет доступна в включенном скрипте b.inc
. Однако в пользовательских функциях вводится локальная функция. Любая переменная, используемая внутри функции, по умолчанию ограничена областью локальных функций. Например:
<?php
$a = 1; /* global scope */
function test()
{
echo $a; /* reference to local scope variable */
}
test();
?>
Этот сценарий не будет выдавать какой-либо вывод, потому что оператор echo ссылается на локальную версию переменной $ a, и ей не присваивается значение в этой области. Вы можете заметить, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны для функций, если они не переопределены локальным определением. Это может вызвать некоторые проблемы в том, что люди могут непреднамеренно изменить глобальную переменную. В PHP глобальные переменные должны быть объявлены глобальными внутри функции, если они будут использоваться в этой функции.
Краткий ответ: writeJPEG()
нужна матрица значений от 0 до 1. Вы предоставляете ей необработанные данные, значения которых находятся в диапазоне 0-255.
Подробно, приведенный вами пример (yalefaces.mat
) имеет размеры:
> faces <- readMat("https://github.com/angelleng/545dump/blob/master/yalefaces.mat?raw=true")
> dim(faces[[1]])
[1] 48 42 2414
, так что на самом деле это 2414 граней размером 48x42. Мы можем отобразить один из них следующим образом:
> image(faces[[1]][,,1])
Если вы усредните их (конечно, не пытаясь изменить размер массива):
> mean.all.faces <- apply(faces[[1]], 1:2, mean)
> image(mean.all.faces)
, кажется, работает нормально:
Но когда вы записываете это в JPEG, следующее даст мусор:
> writeJPEG(mean.all.faces, "BAD.jpg")
, в то время как следующие работы (хотя и немного темные):
> writeJPEG(mean.all.faces/255, "GOOD.jpg")