소스 정보
- 저장소
- ahay/src
- 최근 소스 활동
- 2026년 6월 5일 21:20
- 감지된 SKILL.md 언어
- 영어
- 스타
- 339
- 포크
- 188
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/ahay/src --skill authoring-sf-programs-octave명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | authoring-sf-programs-octave |
| description | Use when authoring a Madagascar sf* main program in GNU Octave. |
Use this skill when you want to write a Madagascar sf<name> program using
GNU Octave — the open-source, MATLAB-compatible interpreter — and you do not
have a MATLAB license.
Disambiguation: .m files are shared by Octave and MATLAB. A file named
M<name>.m could target either runtime. The difference is entirely in how
Madagascar is configured and how the helpers are installed:
.m helper files; no MEX compilation
required; enabled with API=octave at configure time; installs the
rsf_*.m helpers to Octave's function path.mex; enabled with
API=matlab; requires a MATLAB license. See
skills/authoring-sf-programs-matlab/SKILL.md.Typical users of this path: researchers who want MATLAB-like array syntax and
existing .m algorithms without a proprietary license.
Always load the shared conventions skill alongside this one: skills/authoring-sf-programs/
A minimal Octave M<name>.m script. No MEX compilation is needed — the Octave
API is implemented as pure .m helper files (rsf_create.m, rsf_dim.m,
rsf_par.m) that are placed on Octave's function path at install time.
% Mscale.m — sf<name> skeleton for GNU Octave
% One-line description of what this program does.
%
% Usage: sfscale < input.rsf scale=2.0 > output.rsf
% Read mandatory scalar parameter (no default -> error if absent)
[scale, st] = rsf_par('in.rsf', 'scale', []);
if st.err; error(st.msg); end
if isempty(scale); error('scale= required'); end
% Read optional integer parameter with default
[niter, st] = rsf_par('in.rsf', 'niter', 100);
if st.err; error(st.msg); end
% Query dimensions of input file
[dims, st] = rsf_dim('in.rsf');
if st.err; error(st.msg); end
n1 = dims(1);
n2 = dims(2); % 1 if the dataset is 1-D
% Create output header by cloning the input header
st = rsf_create('out.rsf', 'in.rsf');
if st.err; error(st.msg); end
% Read binary data (rsf_read / rsf_write are NOT yet in api/octave;
% use sfdd or a shell pipe to convert to a plain binary float array)
fid_in = fopen('<&0', 'rb'); % stdin when invoked as sf program
data = fread(fid_in, n1*n2, 'float32');
fclose(fid_in);
% Process
data = data * scale;
% Write
fid_out = fopen('>&1', 'wb'); % stdout
fwrite(fid_out, data, 'float32');
fclose(fid_out);
Note on stdin/stdout: When Madagascar invokes a program via a pipeline,
stdincarries the raw RSF binary andstdoutmust produce the raw binary for the next stage. Octave scripts can usefopen('<&0','rb')andfopen('>&1','wb')for this purpose on POSIX systems.
All helpers live in api/octave/. They call underlying sf* command-line
tools via system() and return a stat struct with fields stat.err
(logical) and stat.msg (string).
| Function | Signature | Purpose |
|---|---|---|
rsf_create | stat = rsf_create(out_filename, arg2) | Write an RSF header. arg2 is either an existing .rsf filename (copies that header) or a numeric vector of dimensions (creates a new header via sfcreate). |
rsf_dim | [dims, stat] = rsf_dim(in) | Return a vector of dimensions for the RSF file in, with trailing length-1 dimensions stripped. Calls sffiledims parform=n internally. |
rsf_par | [par, stat] = rsf_par(file, name, default) | Read scalar parameter name from header file. Returns default when the key is absent. Calls sfget parform=n internally. |
Error handling pattern (use consistently):
[val, st] = rsf_par('in.rsf', 'n1', 1);
if st.err
error('rsf_par failed: %s', st.msg);
end
rsf_read / rsf_write are not present in api/octave/ (only in
api/matlab/ as MEX entry points). Read/write the binary payload directly
via Octave's fread/fwrite or by piping through sfdd.
api/octave/SConstruct is currently empty (placeholder); the .m helpers are
plain Octave function files that require no compilation step.
At configure time (framework/configure.py, octave() function):
WhereIs('octave') is run; if found, env['OCTAVE'] is set.WhereIs('mkoctfile') is checked; env['MKOCTFILE'] is set if found.
mkoctfile is the Octave function compiler (analogous to mex), but
it is not required for the pure .m API — only needed if you later
add compiled oct-files (.oct). The plain rsf_*.m helpers install
without it.API=octave (or including octave in
the comma-separated API list) to scons.Installing the helpers: the rsf_*.m files must be on Octave's function
path before your script can call them. Typical approaches:
# Option A: add to OCTAVE_PATH environment variable
export OCTAVE_PATH=/path/to/RSFROOT/lib:$OCTAVE_PATH
# Option B: addpath() inside your script (useful for SConstruct flows)
octave --eval "addpath('/path/to/RSFROOT/lib'); Mscale(...)"
New user programs — no MEX compile step is needed. Place M<name>.m in
user/<youruser>/ and invoke it from a Flow() via the OCTAVE env
variable (similar to the pattern in
book/rsf/school2025/plots/SConstruct):
# In user/<youruser>/SConstruct
octave = env.get('OCTAVE')
if octave:
Flow('output', 'input',
'%s --eval "addpath(...); Mscale(\'${SOURCE}\', \'${TARGET}\', ...); exit;"'
% octave, stdin=0, stdout=-1)
Because the script is interpreted, the SConstruct does not need a compile step — only an install/path setup.
Files in api/octave/ with one-line descriptions:
| File | Description |
|---|---|
rsf_create.m | Write an RSF header to disk — copies an existing header or creates one from a dimension vector by calling sfcreate. |
rsf_dim.m | Return the dimension vector of an RSF file by calling sffiledims parform=n; strips trailing length-1 dimensions. |
rsf_par.m | Read a named scalar parameter from an RSF header by calling sfget parform=n; returns a caller-supplied default when the key is absent. |
SConstruct | Placeholder (empty); no compilation targets are needed for the pure .m Octave API. |
File naming, self-documentation comment format, parameter conventions, error
handling, testing, and build integration patterns that apply to every
sf<name> program regardless of language are documented in:
Key reminders from that skill relevant to Octave programs:
M<name>.m inside user/<youruser>/.sf<name> (build system drops M, prepends
sf)..m extension is shared with MATLAB; configure time (API=octave vs.
API=matlab) determines which runtime is used and whether MEX compilation
is required.% comment block describing the program
and its parameters so sfdoc sf<name> works correctly.