* Bug 7293 fixed: circshift() introduced 25/19625/17
Samuel GOUGEON [Sun, 17 Dec 2017 19:32:00 +0000 (20:32 +0100)]
  http://bugzilla.scilab.org/7293

  Other shifting modes useful with hypermatrices could be implemented.
  This implementation of classical features is expected for a long time.
  Submitting it as is.
  It will still be possible to add new hypermatrices features later.

Change-Id: I1c07b9a17efaa2bf7dd65a5eb82738b8c29527b6

scilab/CHANGES.md
scilab/modules/elementary_functions/help/en_US/matrixmanipulation/circshift.xml [new file with mode: 0644]
scilab/modules/elementary_functions/help/en_US/matrixmanipulation/flipdim.xml
scilab/modules/elementary_functions/help/fr_FR/matrixmanipulation/flipdim.xml
scilab/modules/elementary_functions/help/ja_JP/matrixmanipulation/flipdim.xml
scilab/modules/elementary_functions/macros/circshift.sci [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/circshift.tst [new file with mode: 0644]
scilab/modules/signal_processing/help/en_US/transforms/fftshift.xml
scilab/modules/signal_processing/help/ja_JP/transforms/fftshift.xml

index 8b7db12..eac759a 100644 (file)
@@ -188,6 +188,7 @@ Feature changes and additions
 * The left .\. and right ./. Kronecker divisions are now implemented, for arrays of decimal or complex numbers.
 * `perms` can now build and return only unique permutations, without duplicates.
 * Most of graphic objects can be moved interactively in opened figures.
+* `circshift` is introduced.
 
 
 Help pages:
@@ -267,6 +268,7 @@ Bug Fixes
 * [#2694](https://bugzilla.scilab.org/2694): `bitget` did not accept positive integers of types int8, int16 or int32.
 * [#5824](https://bugzilla.scilab.org/5824): The `datafit` algorithm was not documented.
 * [#6070](https://bugzilla.scilab.org/6070): How to make multiscaled plots was not documented.
+* [#7293](http://bugzilla.scilab.org/show_bug.cgi?id=7293): There was no function to circularly shift components, rows, columns or subarrays of an array. `circshift` introduced.
 * [#7562](https://bugzilla.scilab.org/7562): `factorial` could use a huge memory amount even for a scalar argument.
 * [#7589](https://bugzilla.scilab.org/7589): There was no function computing the binomial coefficients.
 * [#7657](https://bugzilla.scilab.org/7657): `lstsize` was a duplicate of `size` and should be removed.
diff --git a/scilab/modules/elementary_functions/help/en_US/matrixmanipulation/circshift.xml b/scilab/modules/elementary_functions/help/en_US/matrixmanipulation/circshift.xml
new file mode 100644 (file)
index 0000000..405a2aa
--- /dev/null
@@ -0,0 +1,303 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2017 - Samuel GOUGEON
+ *
+ * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ *
+ * This file is hereby licensed under the terms of the GNU GPL v2.0,
+ * pursuant to article 5.3.4 of the CeCILL v.2.1.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * and continues to be available under such terms.
+ * For more information, see the COPYING file which you should have received
+ * along with this program.
+ *
+ -->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+        xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML"
+        xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
+        xml:lang="en" xml:id="circshift">
+    <refnamediv>
+        <refname>circshift</refname>
+        <refpurpose>
+            circularly shifts elements or subarrays of an array (regular, of structures, cells, custom)
+        </refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Syntax</title>
+        <synopsis>
+            B = circshift(A, shift)
+            B = circshift(A, shift, 0)
+            B = circshift(A, shifts)
+            B = circshift(A, shifts, dims)
+        </synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>A, B</term>
+                <listitem>
+                    <para>
+                        row, column, matrix or 2D array, hypermatrix or ND-array of any number of
+                        dimensions and of any sizes. <varname>B</varname> has the shape, sizes and
+                        type of <varname>A</varname>. Custom types are accepted provided that
+                        <literal>size()</literal>, insertion, and extraction operators are
+                        defined for <varname>A</varname>'s type.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>shift</term>
+                <listitem>
+                    <para>
+                        unique positive or negative integer: the shift to apply to indices along
+                        the first non-singleton dimension, or to linear indices of
+                        <varname>A</varname> components if <literal>0</literal> is used as third
+                        input argument.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>shifts</term>
+                <listitem>
+                    <para>
+                        vector of positive or negative integers: shifts to apply on ranges along
+                        directions specified in <varname>dims</varname>
+                        (or <literal>1:length(shifts)</literal> by default).
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>dims</term>
+                <listitem>
+                    <para>
+                        Vector of integers in <literal>[1, ndims(A)]</literal>: indices of
+                        <varname>A</varname> dimensions along which the respective
+                        <literal>shifts</literal> must be performed.
+                    </para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>
+            <literal>circshift(A, shift)</literal> shifts along the first dimension of
+            <literal>A</literal> of size > 1.
+        </para>
+        <para>
+            <literal>circshift(A, shift, 0)</literal> circularly shifts <literal>A</literal>
+            components by <varname>shift</varname> positions.
+        </para>
+        <para>
+            <literal>circshift(A, shifts)</literal> circularly shifts
+            indices of <literal>A</literal> rows by <literal>shifts(1)</literal>,
+            indices of <literal>A</literal> columns by <literal>shifts(2)</literal>,
+            indices of <literal>A</literal> layers by <literal>shifts(3)</literal>, etc.
+        </para>
+        <para>
+            <literal>circshift(A, shifts, dims)</literal> circularly shifts <literal>A</literal>
+            by <literal>shifts(1)</literal> along its dimension #<literal>dims(1)</literal>,
+            by <literal>shifts(2)</literal> along its dimension #<literal>dims(2)</literal>, etc.
+        </para>
+    </refsection>
+    <refsection>
+        <title>Examples</title>
+        <programlisting role="example"><![CDATA[
+circshift(1:7, 2)
+circshift(1:7, -1)
+      ]]></programlisting>
+      <screen><![CDATA[
+--> circshift(1:7, 2)
+ ans  =
+   6.   7.   1.   2.   3.   4.   5.
+
+--> circshift(1:7, -1)
+ ans  =
+   2.   3.   4.   5.   6.   7.   1.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+M = matrix(1:12, 3, 4)
+circshift(M, 1)
+circshift(M, 1, 2)
+circshift(M, [-1 1])
+circshift(M, [-2 1], [2 1])
+      ]]></programlisting>
+      <screen><![CDATA[
+--> M = matrix(1:12, 3, 4)
+ M  =
+   1.   4.   7.   10.
+   2.   5.   8.   11.
+   3.   6.   9.   12.
+
+--> circshift(M, 1)
+ ans  =
+   3.   6.   9.   12.
+   1.   4.   7.   10.
+   2.   5.   8.   11.
+
+--> circshift(M, 1, 2)
+ ans  =
+   10.   1.   4.   7.
+   11.   2.   5.   8.
+   12.   3.   6.   9.
+
+--> circshift(M, [-1 1])
+ ans  =
+   11.   2.   5.   8.
+   12.   3.   6.   9.
+   10.   1.   4.   7.
+
+--> circshift(M, [-2 1], [2 1])
+ ans  =
+   9.   12.   3.   6.
+   7.   10.   1.   4.
+   8.   11.   2.   5.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+M = matrix(1:12, 3, 4)
+circshift(M, 5, 0)
+      ]]></programlisting>
+      <screen><![CDATA[
+--> circshift(M, 5, 0)
+ ans  =
+   8.    11.   2.   5.
+   9.    12.   3.   6.
+   10.   1.    4.   7.
+]]></screen>
+    <para>
+    <emphasis role="bold">With an hypermatrix of texts:</emphasis>
+    </para>
+        <programlisting role="example"><![CDATA[
+t = matrix([string(1:12) strsplit("a":"l")' strsplit("A":"L")'],3,4,3)
+circshift(t, 1, 0)
+circshift(t, 1)
+circshift(t, 1, 3)
+circshift(t, [1 -1], [2 3])
+      ]]></programlisting>
+      <screen><![CDATA[
+--> t = matrix([string(1:12) strsplit("a":"l")' strsplit("A":"L")'],3,4,3)
+ t  =
+(:,:,1)
+!1  4  7  10  !
+!2  5  8  11  !
+!3  6  9  12  !
+
+(:,:,2)
+!a  d  g  j  !
+!b  e  h  k  !
+!c  f  i  l  !
+
+(:,:,3)
+!A  D  G  J  !
+!B  E  H  K  !
+!C  F  I  L  !
+
+--> circshift(t, 1, 0)
+ ans  =
+(:,:,1)
+!L  3  6  9   !
+!1  4  7  10  !
+!2  5  8  11  !
+
+(:,:,2)
+!12  c  f  i  !
+!a   d  g  j  !
+!b   e  h  k  !
+
+(:,:,3)
+!l  C  F  I  !
+!A  D  G  J  !
+!B  E  H  K  !
+
+--> circshift(t, 1)
+ ans  =
+(:,:,1)
+!3  6  9  12  !
+!1  4  7  10  !
+!2  5  8  11  !
+
+(:,:,2)
+!c  f  i  l  !
+!a  d  g  j  !
+!b  e  h  k  !
+
+(:,:,3)
+!C  F  I  L  !
+!A  D  G  J  !
+!B  E  H  K  !
+
+--> circshift(t, 1, 3)
+ ans  =
+(:,:,1)
+!A  D  G  J  !
+!B  E  H  K  !
+!C  F  I  L  !
+
+(:,:,2)
+!1  4  7  10  !
+!2  5  8  11  !
+!3  6  9  12  !
+
+(:,:,3)
+!a  d  g  j  !
+!b  e  h  k  !
+!c  f  i  l  !
+
+--> circshift(t, [1 -1], [2 3])
+ ans  =
+(:,:,1)
+!j  a  d  g  !
+!k  b  e  h  !
+!l  c  f  i  !
+
+(:,:,2)
+!J  A  D  G  !
+!K  B  E  H  !
+!L  C  F  I  !
+
+(:,:,3)
+!10  1  4  7  !
+!11  2  5  8  !
+!12  3  6  9  !
+]]></screen>
+    <para>
+    <emphasis role="bold">With an array of cells:</emphasis>
+    </para>
+        <programlisting role="example"><![CDATA[
+L = list(1,%t);
+C = {%f "a" %i  %z
+     %t "b" %e  %s
+      0 "c" %pi L }
+circshift(C, 1, 0)
+circshift(C, 1)
+circshift(C, 1, 2)
+circshift(C, [1 -1])
+      ]]></programlisting>
+    </refsection>
+    <refsection role="see also">
+        <title>See also</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="flipdim">flipdim</link>
+            </member>
+            <member>
+                <link linkend="fftshift">fftshift</link>
+            </member>
+        </simplelist>
+    </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1</revnumber>
+                <revremark>
+                    <literal>circshift()</literal> introduced.
+                </revremark>
+            </revision>
+        </revhistory>
+    </refsection>
+</refentry>
\ No newline at end of file
index e86744e..de03021 100644 (file)
@@ -207,6 +207,9 @@ y = flipdim(x, 2, 5); // size(X) = [1 12] and blockSize=5 does not divide 12.
         <title>See also</title>
         <simplelist type="inline">
             <member>
+                <link linkend="circshift">circshift</link>
+            </member>
+            <member>
                 <link linkend="fftshift">fftshift</link>
             </member>
             <member>
index 3ace3f9..4da9ac8 100644 (file)
@@ -212,6 +212,9 @@ y = flipdim(x, 2, 5); // size(X) = [1 12] et blockSize=5 ne divise pas 12.
         <title>Voir aussi</title>
         <simplelist type="inline">
             <member>
+                <link linkend="circshift">circshift</link>
+            </member>
+            <member>
                 <link linkend="fftshift">fftshift</link>
             </member>
             <member>
index 30c8b9e..ba25404 100644 (file)
@@ -207,6 +207,9 @@ y = flipdim(x, 2, 5); // size(X) = [1 12] および blockSize=5 は 12を割り
         <title>参照</title>
         <simplelist type="inline">
             <member>
+                <link linkend="circshift">circshift</link>
+            </member>
+            <member>
                 <link linkend="fftshift">fftshift</link>
             </member>
             <member>
diff --git a/scilab/modules/elementary_functions/macros/circshift.sci b/scilab/modules/elementary_functions/macros/circshift.sci
new file mode 100644 (file)
index 0000000..3e1b310
--- /dev/null
@@ -0,0 +1,102 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function R = circshift(M, sh, d)
+
+    // SPECIAL SIMPLE CASES
+    // --------------------
+    if argn(2) == 0 then
+        R = []
+        return
+    end
+
+    Fname = "circshift"
+
+    // M must be sizeable (including for custom types)
+    try
+        s = size(M)
+        n = size(M,"*")
+    catch
+        msg = _("%s: Argument #%d: Wrong type. A sizeable type expected.\n");
+        error(msprintf(msg, Fname, 1));
+    end
+
+    if or(n == [0, 1]) then
+        R = M
+        return
+    end
+
+    nd = length(s)    // Number of Dimensions (without using ndims())
+
+    // CHECKING INPUT ARGUMENTS. DEFAULTS
+    // ----------------------------------
+    if ~isdef("sh", "l") then
+        msg = _("%s: Wrong number of input arguments: %d to %d expected.\n");
+        error(msprintf(msg, Fname, 2, 3));
+    end
+    if and(type(sh) ~= [1 8]) | ~and(sh == int(sh)) then
+        msg = _("%s: Argument #%d: Integer(s) expected.\n");
+        error(msprintf(msg, Fname, 2));
+    end
+    if length(sh) > nd then
+        msg = _("%s: Argument #%d: Must be in the interval [%s, %s].\n");
+        error(msprintf(msg, Fname, 2, "1", msprintf("%s\n", nd)));
+    end
+    sh = double(sh);
+    //
+    if ~isdef("d", "l") then
+        if length(sh) == 1 then
+            d = find(s > 1, 1)
+            if d == [] then
+                d = 1
+            end
+        else
+            d = 1:length(sh)
+        end
+    else
+        if and(type(d) ~= [1 8]) | ~and(d == int(d)) then
+            msg = _("%s: Argument #%d: Integer(s) expected.\n");
+            error(msprintf(msg, Fname, 3));
+        end
+        d = double(d);
+        if (length(d) == 1 & (d < 0 | d > nd)) | (length(d) > 1 & or(d < 1 | d > nd)) then
+            msg = _("%s: Argument #%d: Must be in the interval [%s, %s].\n");
+            error(msprintf(msg, Fname, 3, "1", msprintf("%d\n", nd)));
+        end
+    end
+
+    // PROCESSING
+    // ----------
+    R = M
+
+    // Shift of linearized indices
+    if length(d) == 1 & d == 0 then
+        if sh > 0 then
+            R(:) = M([n-sh+1:n 1:(n-sh)]);
+        else
+            R(:) = M([1-sh:n 1:-sh]);
+        end
+        return
+    end
+
+    // Shifts of ranges:
+    for i = 1:length(sh)
+        si = s(d(i));
+        if si > 1 then
+            D = pmodulo(sh(i), si)
+            if D ~= 0 then
+                S = emptystr(1, nd) + ":"
+                S(d(i)) = "[si-D+1:si 1:si-D]"
+                S = strcat(S, ",")
+                execstr("R = R("+S+")")
+            end
+        end
+    end
+endfunction
diff --git a/scilab/modules/elementary_functions/tests/unit_tests/circshift.tst b/scilab/modules/elementary_functions/tests/unit_tests/circshift.tst
new file mode 100644 (file)
index 0000000..58ff982
--- /dev/null
@@ -0,0 +1,179 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+// With []
+assert_checkequal(circshift([], 1), []);
+assert_checkequal(circshift([], 1, 2), []);
+assert_checkequal(circshift([], 1, 0), []);
+
+// With a row
+assert_checkequal(circshift(1:9, 0), 1:9);
+assert_checkequal(circshift(1:9, 1), [9 1:8]);
+assert_checkequal(circshift(1:9, [2 1]), [9 1:8]);
+assert_checkequal(circshift(1:9, [1 2], [2 1]), [9 1:8]);
+assert_checkequal(circshift(1:9, -1), [2:9 1]);
+assert_checkequal(circshift(1:9, [2 -1]), [2:9 1]);
+assert_checkequal(circshift(1:9, [-1 2], [2 1]), [2:9 1]);
+assert_checkequal(circshift(1:9, -2, 0), [3:9 1:2]);
+assert_checkequal(circshift(1:9, [2 -2], [2 2]), 1:9);
+
+// With a column
+assert_checkequal(circshift((1:9)', 0), (1:9)');
+assert_checkequal(circshift((1:9)', 1), [9 1:8]');
+assert_checkequal(circshift((1:9)', [1 2]), [9 1:8]');
+assert_checkequal(circshift((1:9)', [2 1], [2 1]), [9 1:8]');
+assert_checkequal(circshift((1:9)', -1), [2:9 1]');
+assert_checkequal(circshift((1:9)', [-1 2]), [2:9 1]');
+assert_checkequal(circshift((1:9)', [2 -1], [2 1]), [2:9 1]');
+assert_checkequal(circshift((1:9)', -2, 0), [3:9 1:2]');
+assert_checkequal(circshift((1:9)', [2 -2], [1 1]), (1:9)');
+
+// With a matrix
+M = [1  2  3  4
+     5  6  7  8
+     9 10 11 12];
+assert_checkequal(circshift(M, 0), M);
+assert_checkequal(circshift(M, 1),  [9 10 11 12; 1  2  3  4; 5 6 7 8]);
+assert_checkequal(circshift(M, -1), [5 6  7  8 ; 9 10 11 12; 1 2 3 4]);
+assert_checkequal(circshift(M, [2 -2], [1 1]), M);
+assert_checkequal(circshift(M, [2 -2], [2 2]), M);
+assert_checkequal(circshift(M, 3), M);
+assert_checkequal(circshift(M, -3), M);
+assert_checkequal(circshift(M, 4, 2), M);
+assert_checkequal(circshift(M, -4, 2), M);
+assert_checkequal(circshift(M, [3 4], [1 2]), M);
+assert_checkequal(circshift(M, [1 2], [1 2]), [11 12 9 10 ; 3 4 1 2 ; 7 8 5 6]);
+assert_checkequal(circshift(M, [-2 -2], [1 2]), [11 12 9 10 ; 3 4 1 2 ; 7 8 5 6]);
+assert_checkequal(circshift(M, 1, 0), [12 9 10 11 ; 1 2 3 4 ; 5 6 7 8]);
+assert_checkequal(circshift(M, 3, 0), circshift(M,1,2));
+
+// With shifts or/and dims specified as encoded integers:
+// -----------------------------------------------------
+assert_checkequal(circshift(M, int8(-3)), M);
+assert_checkequal(circshift(M, 4, int8(2)), M);
+assert_checkequal(circshift(M, int16(-4), uint8(2)), M);
+assert_checkequal(circshift(M, uint8([3 4]), uint16([1 2])), M);
+
+
+// With an hypermatrix of texts
+// ============================
+t = matrix([string(1:12) strsplit("a":"l")' strsplit("A":"L")'],3,4,3);
+// t  =
+//(:,:,1)
+//!1  4  7  10  !
+//!2  5  8  11  !
+//!3  6  9  12  !
+//
+//(:,:,2)
+//!a  d  g  j  !
+//!b  e  h  k  !
+//!c  f  i  l  !
+//
+//(:,:,3)
+//!A  D  G  J  !
+//!B  E  H  K  !
+//!C  F  I  L  !
+// ---------
+expected = cat(3, ["L" "3" "6" "9" ; "1" "4" "7" "10"; "2" "5" "8" "11"], ..
+                  ["12" "c" "f" "i"; "a" "d" "g" "j" ; "b" "e" "h" "k" ], ..
+                  ["l" "C" "F" "I" ; "A" "D" "G" "J" ; "B" "E" "H" "K" ]);
+assert_checkequal(circshift(t, 1, 0), expected);
+//     ans  =
+//    (:,:,1)
+//    !L  3  6  9   !
+//    !1  4  7  10  !
+//    !2  5  8  11  !
+//    (:,:,2)
+//    !12  c  f  i  !
+//    !a   d  g  j  !
+//    !b   e  h  k  !
+//    (:,:,3)
+//    !l  C  F  I  !
+//    !A  D  G  J  !
+//    !B  E  H  K  !
+// ---------
+expected = cat(3, ["3" "6" "9" "12" ; "1" "4" "7" "10" ; "2" "5" "8" "11"], ..
+                  ["c" "f" "i" "l"  ; "a" "d" "g" "j"  ; "b" "e" "h" "k"], ..
+                  ["C" "F" "I" "L"  ; "A" "D" "G" "J"  ; "B" "E" "H" "K"]);
+assert_checkequal(circshift(t, 1), expected);
+//     ans  =
+//    (:,:,1)
+//    !3  6  9  12  !
+//    !1  4  7  10  !
+//    !2  5  8  11  !
+//    (:,:,2)
+//    !c  f  i  l  !
+//    !a  d  g  j  !
+//    !b  e  h  k  !
+//    (:,:,3)
+//    !C  F  I  L  !
+//    !A  D  G  J  !
+//    !B  E  H  K  !
+// ---------
+expected = cat(3, ["A" "D" "G" "J" ; "B" "E" "H" "K" ; "C" "F" "I" "L"], ..
+                  ["1" "4" "7" "10"; "2" "5" "8" "11"; "3" "6" "9" "12"], ..
+                  ["a" "d" "g" "j" ; "b" "e" "h" "k" ; "c" "f" "i" "l"]);
+assert_checkequal(circshift(t, 1, 3), expected);
+//     ans  =
+//    (:,:,1)
+//    !A  D  G  J  !
+//    !B  E  H  K  !
+//    !C  F  I  L  !
+//    (:,:,2)
+//    !1  4  7  10  !
+//    !2  5  8  11  !
+//    !3  6  9  12  !
+//    (:,:,3)
+//    !a  d  g  j  !
+//    !b  e  h  k  !
+//    !c  f  i  l  !
+// ---------
+expected = cat(3, ["j"  "a" "d" "g" ; "k" "b" "e" "h" ; "l" "c" "f" "i"], ..
+                  ["J"  "A" "D" "G" ; "K" "B" "E" "H" ; "L" "C" "F" "I"], ..
+                  ["10" "1" "4" "7"; "11" "2" "5" "8"; "12" "3" "6" "9"]);
+assert_checkequal(circshift(t, [1 -1], [2 3]), expected);
+//     ans  =
+//    (:,:,1)
+//    !j  a  d  g  !
+//    !k  b  e  h  !
+//    !l  c  f  i  !
+//    (:,:,2)
+//    !J  A  D  G  !
+//    !K  B  E  H  !
+//    !L  C  F  I  !
+//    (:,:,3)
+//    !10  1  4  7  !
+//    !11  2  5  8  !
+//    !12  3  6  9  !
+
+// With a cell array
+// =================
+L = list(1,%t);
+M = {%f "a" %i  %z
+     %t "b" %e  %s
+      0 "c" %pi L };
+assert_checkequal(circshift(M, 0), M);
+assert_checkequal(circshift(M, 1), {0 "c" %pi L ; %f "a" %i  %z ; %t "b" %e  %s});
+assert_checkequal(circshift(M, -2), {0 "c" %pi L ; %f "a" %i  %z ; %t "b" %e  %s});
+assert_checkequal(circshift(M, [2 -2], [1 1]), M);
+assert_checkequal(circshift(M, [2 -2], [2 2]), M);
+assert_checkequal(circshift(M, 3), M);
+assert_checkequal(circshift(M, -3), M);
+assert_checkequal(circshift(M, 4, 2), M);
+assert_checkequal(circshift(M, -4, 2), M);
+assert_checkequal(circshift(M, [3 4], [1 2]), M);
+assert_checkequal(circshift(M, [1 2], [1 2]), {%pi L 0 "c" ; %i %z %f "a"; %e %s %t "b"});
+assert_checkequal(circshift(M, [-2 -2],[1 2]),{%pi L 0 "c" ; %i %z %f "a"; %e %s %t "b"});
+
index cfce55c..fd861e5 100644 (file)
@@ -1,5 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="en" xml:id="fftshift">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML"
+          xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
+          xml:lang="en" xml:id="fftshift">
     <refnamediv>
         <refname>fftshift</refname>
         <refpurpose>rearranges the fft output, moving the zero frequency to the center of the spectrum</refpurpose>
@@ -161,14 +164,17 @@ subplot(2,1,2); Matplot(fftshift(abs(y)))
         <title>See also</title>
         <simplelist type="inline">
             <member>
-                <link linkend="fft">fft</link>
-            </member>
-            <member>
                 <link linkend="ifftshift">ifftshift</link>
             </member>
             <member>
                 <link linkend="flipdim">flipdim</link>
             </member>
+            <member>
+                <link linkend="circshift">circshift</link>
+            </member>
+            <member>
+                <link linkend="fft">fft</link>
+            </member>
         </simplelist>
     </refsection>
 </refentry>
index 9619bb0..8031279 100644 (file)
@@ -160,14 +160,17 @@ subplot(2,1,2); Matplot(fftshift(abs(y)))
         <title>参照</title>
         <simplelist type="inline">
             <member>
-                <link linkend="fft">fft</link>
-            </member>
-            <member>
                 <link linkend="ifftshift">ifftshift</link>
             </member>
             <member>
                 <link linkend="flipdim">flipdim</link>
             </member>
+            <member>
+                <link linkend="circshift">circshift</link>
+            </member>
+            <member>
+                <link linkend="fft">fft</link>
+            </member>
         </simplelist>
     </refsection>
 </refentry>
\ No newline at end of file