如何在MATLAB中创建“^”字符?

时间:2009-11-18 22:00:00

标签: matlab windows-xp internationalization

^是MATLAB中的指数运算符。它的问题在于它不存在于很多非英语键盘布局中,如果你在工作中使用它很多,在HR和EN之间切换会很麻烦。

有没有办法将它添加到MATLAB的工具栏(就像在Excel中,所以你可以通过鼠标或触摸板使用它),或者在MATLAB中定义一个自定义键(例如,F12)来替换它?

我希望有一个非AHK解决方案,等等。

6 个答案:

答案 0 :(得分:11)

在Windows中(启用Num Lock),按住 Alt ,在数字小键盘上键入 9 4 ,然后释放 ALT ^将插入光标处。

这是在Windows中插入任意Unicode字符的一般技术,无论它们是否在键盘上。

^字符为U+5E,小数为94

答案 1 :(得分:11)

创建工具栏快捷方式,为其命名,并将以下内容放入回调中:

clipboard('copy','^')

运行此命令会将指数字符^放在剪贴板中。按下它后,执行 Ctrl + V 将其粘贴。

您可以应用此想法来创建可从MATLAB的“开始”菜单访问的片段片段库。

答案 2 :(得分:6)

我建议在EditorMacro上从Yair Altman下载提交内容MathWorks File Exchange。如果在MATLAB命令窗口中运行以下代码(当MATLAB编辑器打开时):

EditorMacro('Alt 6','^');

它会在MATLAB编辑器和命令窗口的上下文中创建一个宏,当你按下组合键 Alt + 时,它会在插入符号位置插入字符串^ 6 (据我所知,不应该绑定到任何其他宏/操作。)

由于您提到在CroatianEnglish键盘布局之间来回切换,因此必须记住相同符号的不同组合键可能很烦人。使用EditorMacro,您可以在MATLAB编辑器和命令窗口中创建一组宏,这样您就可以对每个符号使用相同的按键组,而不管您使用的键盘类型如何。

由于每次关闭MATLAB时都会删除用EditorMacro创建的宏,因此可以创建一个startup.m file(每次打开MATLAB时会自动运行)来为您创建宏。该文件可能如下所示:

edit;                      %# Open the Editor so EditorMacro works properly
EditorMacro('Alt 5','%');  %# Create "%" macro
EditorMacro('Alt 6','^');  %# Create "^" macro
EditorMacro('Alt 7','&');  %# Create "&" macro
...

在这个例子中,我基本上使用 Alt 来再现 Shift 的行为加上英文键盘上的数字。


如果一切都失败了......

您始终可以使用functional forms of the arithmetic operators作为最后手段:

  • power(A,B)而非元素强制操作A.^B
  • mpower(A,B)代替矩阵电源操作A^B

它不会漂亮,但它会起作用。

答案 3 :(得分:3)

你有哪种键盘没有?

http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx

我们在看到这个问题后做了快速检查,找不到没有符号的键盘。

与我们的MATLAB I18N团队讨论此事并提出增强请求。

答案 4 :(得分:2)

好的......这是一个hack,它允许你在Matlab的命令窗口和编辑器中重新映射任意键击。这是一个不受支持的黑客攻击,它涉及IDE的未记录内部。但它像你所希望的那样“神奇”。适合我在R2008b和R2009b中使用。

首先,定义一个可以通过将其替换为其他击键输入来处理事件的Java类。将其编译为JAR并将其放在Matlab的javaclasspath上。

package test;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.text.JTextComponent;
import javax.swing.text.TextAction;

/**
 * An action that responds to an event with another keystroke.
 */
public class KeyReplacementAction extends TextAction {

    private final char replacement;

    /**
     * @param name Name of this action (ignored in practice)
     * @param replacement char to replace the event with
     */
    public KeyReplacementAction(String name, char replacement) {
        super(name);
        this.replacement = replacement;
    }

    public void actionPerformed(ActionEvent e) {
        if (!(e.getSource() instanceof JTextComponent)) {
            return;
        }
        JTextComponent src = (JTextComponent) e.getSource();
        KeyEvent replacementEvent = new KeyEvent(src, KeyEvent.KEY_TYPED, 
                java.lang.System.currentTimeMillis(), 0,
                KeyEvent.VK_UNDEFINED, replacement);
        src.dispatchEvent(replacementEvent);
    }

}

现在,使用Matlab代码深入了解IDE的Swing小部件,找到编辑器和命令窗口的键盘映射,并添加处理程序以重新映射到它们。

function remap_keys_in_text_areas()
%REMAP_KEYS_IN_TEXT_AREAS Custom key remapping in Matlab GUI text areas
%
% Must be called after the editor is open, otherwise it won't find the
% editor keymap.

% { from, to; ... }
% Try "disp(char(1:1024))" to see all chars that work in your Matlab font
map = {
    '$' '^'
    '#' char(181)  % might be useful for text formatting
    };

make_sure_editor_is_open(); % otherwise we won't find its keymap

keymaps = find_ide_keymaps();
for i = 1:size(map,1)
    [from,to] = map{i,:};
    disp(sprintf('Re-binding %s to %s in text areas', from, to));
    for j = 1:numel(keymaps)
        bind_keystroke_for(keymaps{j}, from, to);
    end
end

function make_sure_editor_is_open()
s = find_editor_widgets();
if isempty(s.editors)
    edit;
end

function bind_keystroke_for(keymap, from, to)
%BIND_KEYSTROKE_FOR Remap a single keystroke in a text component

import javax.swing.KeyStroke;
import java.awt.event.InputEvent;
import test.KeyReplacementAction;

key = javax.swing.KeyStroke.getKeyStroke(from);
action = KeyReplacementAction(['remap ' from ' to ' to], to);
keymap.addActionForKeyStroke(key, action);

function out = find_ide_keymaps
%FIND_IDE_KEYMAPS Find keymap objects for Matlab IDE widgets
set = java.util.HashSet();
s = find_editor_widgets();
widgets = [s.cmdwin s.editors];
for i = 1:numel(widgets)
    set.add(widgets{i}.getKeymap());
end
set = set.toArray();
out = cell(size(set));
for i = 1:numel(set)
    out{i} = set(i);
end

function out = find_editor_widgets
%FIND_EDITOR_WIDGETS Find editor and command window widgets in Matlab Swing GUI
out.cmdwin = [];
out.editors = {};
wins = java.awt.Window.getOwnerlessWindows();
for i = 1:numel(wins)
    if isa(wins(i), 'com.mathworks.mde.desk.MLMainFrame')
        out.cmdwin = get_command_window_from_mainframe(wins(i));
    elseif isa(wins(i), 'com.mathworks.mde.desk.MLMultipleClientFrame')
        out.editors = [out.editors get_text_areas_from_editor_frame(wins(i))];
    end
end

function out = get_command_window_from_mainframe(frame)
out = findobj_swing_widget(frame, 'com.mathworks.mde.cmdwin.XCmdWndView');

function out = get_text_areas_from_editor_frame(frame)
out = findobj_swing_widget(frame, 'com.mathworks.widgets.SyntaxTextPane');

function out = findobj_swing_widget(widget, klass)
%FINDOBJ_SWING_WIDGET Recursively find all child components of given class
out = {};
if isa(widget, klass)
    out{end+1} = widget;
end
for i = 1:widget.getComponentCount()
    out = [out findobj_swing_widget(widget.getComponent(i-1), klass)];
end

要激活重映射,只需调用该函数即可。您可以在startup.m中执行此操作以使其自动发生。

>> remap_keys_in_text_areas
Re-binding $ to ^ in text areas
Re-binding # to µ in text areas

答案 5 :(得分:1)

您可以简单地使用以下数学标识:

a^b ≡ exp(b*ln(a))

我刚要建议使用C风格POWER(A,B)函数来替换^运算符的功能,但是gnovice打败了我。我想这就是POWER(A,B)MPOWER(A,B)函数的基础。

从发布的答案中可以看出,有很多选择。这是品味,功能和重复的问题。